2015-04-14 6 views
5

Another question ein interessantes Problem angesprochen:Mehrdeutige Pfadtrennzeichen auf Windows - wie man damit umgehen?

Unter Windows ist die Java File.pathSeparatorChar ist ;, was richtig ist. Allerdings ist das Semikolon tatsächlich auch ein gültiges Zeichen für Ordner oder Dateinamen. Sie können unter Windows einen Ordner mit dem Namen Test;Test1 erstellen. Die Frage ist: Wie würden Sie feststellen, ob das Semikolon in einer Pfadliste tatsächlich einen Pfad trennt oder Teil des Verzeichnisnamens ist, wenn die Pfadliste sowohl absolute als auch relative Pfade enthalten kann?

Antwort

3

Wenn der Pfad enthält ein ; selbst muss der Pfad durch doppelte Anführungszeichen " umgeben sein.

folgende kleine PoC

mkdir "foo;bar" 
echo echo execute %%~dpnx0 > "foo;bar\dummy.cmd" 
set PATH=%PATH%;"foo;bar" 
dummy.cmd 

wird der Ausgang

execute R:\temp\foo;bar\dummy.cmd 

bedeutet die dummy.cmd gefunden wird durch den Weg eingerichtet werden.

bearbeiten Wie aus den Kommentaren zu sehen: Mit einem Semiclon könnte Sie in einige Schwierigkeiten führen. Es ist besser, Verzeichnisnamen zu vermeiden, die ein Semikolon enthalten.

+0

Ahaa! Jetzt reden wir. Dies scheint vernünftig zu sein. –

+0

Interessant, das funktioniert, aber als ich 'what dummy' versuchte, fand es es nicht. –

+0

Du meinst 'where dummy'? –

0

In einem Windows PATH ist das Semikolon immer ein Trennzeichen. Wenn Sie einen Ordner mit einem Semikolon im Namen haben, können Sie den kurzen alternativen Namen in PATH eingeben. Um den Kurznamen zu finden, verwenden Sie DIR /X. Zum Beispiel:

C:\> dir test* /X 
<DIR> **TEST_T~1**  Test;Test1 
C:\> set PATH=TEST_T~1;%PATH% 
+0

Während ich das tun konnte, vereitelt es wirklich den Zweck, lange Pfadnamen an erster Stelle zuzulassen, nicht wahr? –

+0

Das Problem ist nicht die Länge des Namens, sondern das Pfadtrennzeichen. Wenn Sie möchten, dass der 'PATH' Ihren Ordner als Ordner interpretiert, müssen Sie ein Formular verwenden, das das Trennzeichen nicht enthält. –

1

Da ist die Frage für Java und basierend auf @SubOptimal answer, die hier in Anführungszeichen mit einem Semikolon Pfade sollten eingeschlossen werden ist erklärt, dass eine kleine Codebeispiel durch File.pathSeparator getrennte Pfade aus einer solchen Liste zu extrahieren:

String separatedList = "\"test;test1\";c:\\windows;\"test2\";test3;;test4"; 

String pattern = String.format("(?:(?:\"([^\"]*)\")|([^%1$s]+))%1$s?", File.pathSeparator); 
Pattern p = Pattern.compile(pattern); 
Matcher m = p.matcher(separatedList); 
while (m.find()) 
{ 
    for (int i = 1; i <= m.groupCount(); i++) 
    { 
     String path = m.group(i); 
     if (path != null) 
      System.out.println(path); 
    } 
} 

Als Referenz ist die Regex ohne die escaping Zeichen (?:(?:"([^"]*)")|([^;]+));?.