Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Wie syntaktische Korrektheit eines Datei namens prüfen?

1 view
Skip to first unread message

Stefan Matthias Aust

unread,
Mar 3, 2004, 10:31:45 AM3/3/04
to
Hi!

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

Juergen Schlag

unread,
Mar 3, 2004, 11:29:15 AM3/3/04
to
Stefan Matthias Aust wrote:

> 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

Marco Schmidt

unread,
Mar 3, 2004, 11:50:06 AM3/3/04
to
Stefan Matthias Aust:

[...]

>Ü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

Wolfgang Zitzelsberger

unread,
Mar 3, 2004, 12:18:20 PM3/3/04
to
> 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,
Wie wärs damit:
File#getCanonicalFile()

Schöne Grüße,
Wolfgang

Nico Seessle

unread,
Mar 3, 2004, 1:47:55 PM3/3/04
to
Stefan Matthias Aust wrote:

> 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

Michael Schierl

unread,
Mar 13, 2004, 2:29:36 PM3/13/04
to
Stefan Matthias Aust <s...@3plus4.de> wrote:

>
>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

Stefan Matthias Aust

unread,
Mar 14, 2004, 3:55:26 AM3/14/04
to
Michael Schierl wrote:

> 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.

0 new messages