2015-04-14 21 views
5

Another question cresciuti un problema interessante:Separatore di percorso ambiguo su Windows: come gestirlo?

Su Windows, Java File.pathSeparatorChar è ;, che è corretto. Tuttavia, il punto e virgola è in realtà anche un carattere valido nella cartella o nei nomi di file. È possibile creare una cartella denominata Test;Test1 su Windows.

La domanda è: come si determina se il punto e virgola in un elenco di percorsi separa effettivamente un percorso o fa parte del nome della directory, se l'elenco dei percorsi può contenere sia percorsi assoluti che relativi?

risposta

3

Se il percorso contiene un ; sé il percorso deve essere circondato da virgolette doppie ".

seguente piccolo PoC

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

l'uscita sarà

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

intende il dummy.cmd è trovato dal percorso di installazione.

modificare Come per vedere dai commenti: L'utilizzo di un semiclon potrebbe portare a qualche guaio. È meglio evitare l'uso di nomi di directory contenenti un punto e virgola.

+0

Ahaa! Ora stiamo parlando. Questo sembra ragionevole. –

+0

Interessante, funziona, ma quando ho provato "quale manichino" non lo ha trovato. –

+0

Vuoi dire 'dove manichino'? –

0

In un Windows PATH il punto e virgola è sempre un separatore. Se hai una cartella con un punto e virgola nel nome, puoi inserire il suo breve nome alternativo nello PATH. Per trovare il nome breve, utilizzare DIR /X. Per esempio:

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

Mentre riuscivo a farlo, in realtà non si riesce a consentire lo sviluppo di nomi di percorsi lunghi, no? –

+0

Il problema non è la lunghezza del nome, ma contiene il separatore del percorso. Se vuoi che il 'PATH' interpreti la tua cartella come una cartella devi usare un modulo che non contenga il separatore. –

1

Dal momento che la domanda è per Java, e sulla base @SubOptimal answer che spiega che i percorsi con un punto e virgola devono essere racchiusi tra virgolette, ecco un esempio di codice piccolo per estrarre i percorsi da tale elenco separato da File.pathSeparator:

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); 
    } 
} 

Per riferimento, la regex senza caratteri di escape è (?:(?:"([^"]*)")|([^;]+));?.

Problemi correlati