Ich würde gerne prüfen, ob ein Dateiname gemäß der
Plattform-spezifischen Konventionen gültig ist. Ich bin mir z.B.
ziemlich sicher, dass "{\:\:\:}" unter Windows illegal ist. Trotzdem
kann ich ein File-Objekt davon bauen und auf "exists()" kommt einfach
"false" zurück. Faktisch korrekt, aber ich möchte gerne zwischen,
gültiger Name, der nicht existiert und Blödsinn, wo man gar nicht
probieren muss, die Datei zu suchen unterscheiden.
Übersehe ich eine Funktion, um zu prüfen, ob der Dateiname überhaupt
syntaktisch korrekt ist?
Falls nein, hat jemand einen regex griffbereit, der das zumindest für
Windows und Linux prüft?
bye
--
Stefan Matthias Aust // "A new beginning always starts at the end" -WT
> Ich würde gerne prüfen, ob ein Dateiname gemäß der
> Plattform-spezifischen Konventionen gültig ist. Ich bin mir z.B.
> ziemlich sicher, dass "{\:\:\:}" unter Windows illegal ist. Trotzdem
> kann ich ein File-Objekt davon bauen und auf "exists()" kommt einfach
> "false" zurück. Faktisch korrekt, aber ich möchte gerne zwischen,
> gültiger Name, der nicht existiert und Blödsinn, wo man gar nicht
> probieren muss, die Datei zu suchen unterscheiden.
>
> Übersehe ich eine Funktion, um zu prüfen, ob der Dateiname überhaupt
> syntaktisch korrekt ist?
>
> Falls nein, hat jemand einen regex griffbereit, der das zumindest für
> Windows und Linux prüft?
Nun, wenn man unter W2k eine Datei mit z.B. einem Doppelpunkt im Namen
anlegt, wird man freundlich darauf aufmerksam gemacht, dass die Zeichen
'\ / : * ? " < > |' enthalten darf.
Eine einfache Regex sollte prüfen, ob es ein mindestens ein Match auf
eines der Zeichen gibt.
Unter Linux kann man meines Wissens den Slash ('/') nicht verwenden, die
anderen Zeichen funktionieren meines Wissens durchaus: Ein
touch "lustige?datei"
legt die Datei mit diesem Namen ohne Murren an, um die Datei an der Bash
anzusprechen, muss man das Zeichen notfalls mit '\' escapen...
Jürgen
[...]
>Übersehe ich eine Funktion, um zu prüfen, ob der Dateiname überhaupt
>syntaktisch korrekt ist?
Nein, so eine Funktion gibt es soweit ich weiß nicht.
>Falls nein, hat jemand einen regex griffbereit, der das zumindest für
>Windows und Linux prüft?
Das dürfte doch sogar von Dateisystem zu Dateisystem verschieden sein
(z.B. in Sachen maximale Namenslänge oder Zeichensatz), zwei reichen
also vermutlich nicht aus.
Ob es reguläre Ausdrücke gibt, die alles abdecken, bezweifle ich auch.
So muß man bei c:\sub1\sub2\..\..\..\..\test.txt hinter sub2 doch den
Zustand "kann hier höchstens zwei Verzeichnisse mit .. hochklettern"
mitführen.
Gruß,
Marco
--
Bitte nur in der Newsgroup antworten, nicht per Email!
de.comp.lang.java Homepage: http://www.dclj.de/
FAQ: http://www.faqs.org/faqs/de/comp-lang-java/faq/
Meine Java-Seiten: http://www.geocities.com/marcoschmidt.geo/java.html
Schöne Grüße,
Wolfgang
> Ich würde gerne prüfen, ob ein Dateiname gemäß der
> Plattform-spezifischen Konventionen gültig ist.
Gültig wofür?
Generell kam ja schon der Tipp mit getCanonicalPath(), der das wohl im
Normalfalle abdecken sollte. Aber z.B. das unten anhängende Programm gibt
---
java.io.IOException: Die Syntax für den Dateinamen, Verzeichnisnamen
oder die Datenträgerbezeichnung ist falsch
at java.io.WinNTFileSystem.canonicalize0(Native Method)
at java.io.Win32FileSystem.canonicalize(Win32FileSystem.java:354)
at java.io.File.getCanonicalPath(File.java:513)
at Test.main(Test.java:11)
7
---
aus. Man kann also daraus lesen, eine solche Datei aber nicht z.B. im
Explorer als neue Datei anlegen (Dafür aber mit "echo Hallo >
foo.txt:bar"). Ausser Java habe ich bis jetzt auch noch nichts gefunden
was diese Daten dann problemlos wieder lesen kann.
Aber um von einem Anwender eingegebene Dateinamen zu prüfen sollte
getCanonicalPath() wohl was passendes sein.
public static void main(String[] args) throws IOException {
File f = new File("C:\\temp\\foo.txt:bar");
try {
System.out.println(f.getCanonicalPath());
} catch (IOException e) {
e.printStackTrace();
}
FileInputStream in = new FileInputStream(f);
System.out.println(in.available());
}
Nico
>
>Ich würde gerne prüfen, ob ein Dateiname gemäß der
>Plattform-spezifischen Konventionen gültig ist. Ich bin mir z.B.
>ziemlich sicher, dass "{\:\:\:}" unter Windows illegal ist. Trotzdem
>kann ich ein File-Objekt davon bauen und auf "exists()" kommt einfach
>"false" zurück. Faktisch korrekt, aber ich möchte gerne zwischen,
>gültiger Name, der nicht existiert und Blödsinn, wo man gar nicht
>probieren muss, die Datei zu suchen unterscheiden.
Was willst du mit der Datei nachher machen? Ein "Y:\blah" wirst du
auch so nicht als syntaktisch falsch erkennen, wenn es Laufwerk "Y"
nicht gibt.
Und unter Linux kann man (je nach Dateisystem, beispielsweise bei
ext[23] oder reiserfs) fast jeden noch so exotischen String als
Dateinamen angeben (ob /../blah geht, weiß ich jetzt allerdings nicht)
- da können auch Zeilenumbrüche etc. drin sein (Nullbytes und 2 direkt
aufeinanderfolgende Slashes gehen AFAIK aber nicht). Das will man aber
nicht, wie ein
touch '
' && cvs update
in einem cvs-pserver-geführten Repository beweist...
Michael
--
My PGP Key: User ID: Michael Schierl <schi...@gmx.de>
Key ID: 0x58B48CDD Size: 2048 Created: 26.03.2002
Fingerprint: 68CE B807 E315 D14B 7461 5539 C90F 7CC8
http://home.arcor.de/mschierlm/mschierlm.asc
> Was willst du mit der Datei nachher machen?
Öffnen. Ich hatte mir vorgenommen, in einem Eingabefeld bereits
anzuzeigen, ob der eingegebene Dateiname wohl gültig ist, inzwischen
aber wieder von dieser Idee Abstand genommen.