2010-06-29 9 views
30

Sto utilizzando Path.Combine in questo modo:Come ottengo .NET Path.Combine per convertire le barre in avanti in backslash?

Path.Combine("test1/test2", "test3\\test4"); 

L'output che ottengo è:

test1/test2\test3\test4 

Notate come la barra non viene convertito in una barra rovesciata. So che posso fare string. Sostituire per cambiarlo, ma c'è un modo migliore per farlo?

+3

Il backslash è un problema? Le API dei file .NET e Windows accettano entrambi. –

+0

Qual è il problema con le barre miste? Vanità? – JBRWilkinson

+4

@ John, sì c'è: http://msdn.microsoft.com/en-us/library/system.io.path.combine.aspx. O stavi cercando di essere pedante circa la differenza tra C# e .NET? –

risposta

18

Poiché il tuo "test1/test2" è già una stringa letterale, Path.Combine non cambierà il '/' per te in un '\'.

Path.Combine sarà solo concat i 2 stringhe letterali con il delimitatore di percorso appropriato utilizzato dal sistema operativo, in questo caso di Windows, che è '\', da lì l'output

test1/test2\test3\test4 

La cosa migliore sarebbe essere la stringa. Sostituire.

+22

Grazie. In alternativa, ho scoperto che 'Path.GetFullPath()' sostituirà anche le barre con barre retroverse. –

+0

Cool, non lo sapevo, ma di sicuro ne prenderò nota. – Riaan

+3

Dopo la mietitrebbia, potresti probabilmente sostituire TUTTI i tipi di barre con 'Path.DirectorySeparatorChar'. –

11

Provare a utilizzare la classe Uri. Creerà Uris valido per la macchina target corretta (/ ->\).

+0

Bene, questo funziona. Ho solo bisogno di creare 'nuovo Uri (percorso)' e si converte automaticamente in barre retroverse. Nice – Edgar

+0

Funziona: 'nuovo Uri (@" c:/temp \ test/"). LocalPath' –

2

In primo luogo, direi, in questo caso particolare, non sarebbe irragionevole fare un singolo .Rimontare()

In secondo luogo, si potrebbe anche usare System.Uri per formattare il vostro percorso, è molto severa. Tuttavia, questo sarà più linee di un semplice .Replace(). Sto già votando per te per usare semplicemente .Replace() da fare con esso! Spero che questo aiuti

-3

No, il carattere di separazione è definito come Sola lettura.

http://msdn.microsoft.com/en-us/library/system.io.path.pathseparator.aspx

È necessario utilizzare un Sostituire in quanto è un cambiamento banale.

+1

Di cosa stai parlando? Anche supponendo che tu intenda 'DirectorySeparator', sta cercando di cambiarlo nella sua stringa, non nel valore usato dal sistema. – Gabe

1

Utilizzando .NET Reflector, si può vedere che Path.Combine non cambia barre nelle stringhe previste

public static string Combine(string path1, string path2) 
{ 
    if ((path1 == null) || (path2 == null)) 
    { 
     throw new ArgumentNullException((path1 == null) ? "path1" : "path2"); 
    } 
    CheckInvalidPathChars(path1); 
    CheckInvalidPathChars(path2); 
    if (path2.Length == 0) 
    { 
     return path1; 
    } 
    if (path1.Length == 0) 
    { 
     return path2; 
    } 
    if (IsPathRooted(path2)) 
    { 
     return path2; 
    } 
    char ch = path1[path1.Length - 1]; 
    if (((ch != DirectorySeparatorChar) && (ch != AltDirectorySeparatorChar)) && (ch != VolumeSeparatorChar)) 
    { 
     return (path1 + DirectorySeparatorChar + path2); 
    } 
    return (path1 + path2); 
} 

Si può fare lo stesso con String.Replace ed i metodi della classe Uri per determinare quale funziona meglio per te.

+0

Nota che 'DirectorySeparatorChar = '\\'' e 'AltDirectorySeparatorChar = '/'' – Greg

65

Come altri hanno già detto, Path.Combine non cambia il separatore. Tuttavia, se si convertirlo in un percorso completo:

Path.GetFullPath(Path.Combine("test1/test2", "test3\\test4")) 

il conseguente percorso completo sarà utilizzare il separatore di directory standard (barra rovesciata per Windows).

+1

Funziona ma fai attenzione poiché GetFullPath() risolverà i percorsi relativi e lo trasformerà in percorsi completi. Se è necessario mantenere un percorso relativo, GetFullPath() non funzionerà. –

+0

Non funziona, i percorsi non cambiano (mono) – George

+0

@George, sei sicuro: mono su quale sistema operativo? Qual è il separatore di percorso standard per la tua versione di mono (Path.DirectorySeparatorChar)? – Joe

Problemi correlati