2010-05-06 1 views
6

È possibile utilizzare la classe System.IO.Path o qualche oggetto simile per formattare un percorso di stile unix, fornendo funzionalità simili alla classe PATH? Per esempio, io posso fare:System.IO.Path o uso equivalente con percorsi Unix

Console.WriteLine(Path.Combine("c:\\", "windows")); 

Che mostra:

"C:\\windows" 

ma provo una cosa simile con barre (/) è semplicemente inverte per me.

Console.WriteLine(Path.Combine("/server", "mydir")); 

Che mostra:

"/server\\mydir" 

risposta

3

In questo caso vorrei usare la classe System.Uri o System.UriBuilder.

Nota a margine: se si esegue il codice .NET su un sistema Linux con Mono-Runtime, la classe Path dovrebbe restituire il comportamento previsto. Le informazioni che utilizza la classe Path sono fornite dal sistema sottostante.

+0

Grazie per quello, ma non riesco a trovare alcun metodo in nessuna di queste classi che sembra essere l'equivoco di .Combine()? –

+0

Non ho trovato utile questo metodo ... Richiede la formattazione URI. UriFormatException: URI non valido: il formato dell'URI non può essere determinato: modello/1024x768 / –

3

Hai problemi più grandi, Unix accetta caratteri in un nome file che Windows non consente. Questo codice bombardare con ArgumentException, "personaggi illegali nel percorso":

string path = Path.Combine("/server", "accts|payable"); 

Non è possibile utilizzare in modo affidabile Path.Combine() per i percorsi Unix.

3

Path.Combine utilizza i valori di Path.DirectorySeperatorChar e Path.VolumeSeparatorChar, e questi sono determinati dalle librerie di classi in runtime - quindi se si scrive il codice usando solo Path.Combine chiamate, Environment.SpecialFolder valori, e così via, è in grado di funzionare in tutto il mondo, dal momento che Mono (e presumibilmente qualsiasi runtime .NET) implementa il modo nativo di ottenere e costruire quei percorsi per qualsiasi piattaforma su cui gira. (Il tuo secondo esempio, per esempio, torna /server/mydir per me, ma il primo esempio dà c:\/windows)

Se si desidera un percorso UNIX specifici hard-coded in tutti i casi, Path.Combine non sta comprando qualsiasi cosa: fa quello Console.WriteLine ("/server/mydir"); vuoi nel PO.

Come diceva Hans, diversi filesystem hanno regole diverse per i caratteri consentiti, lunghezze di percorso e così via, quindi la pratica migliore, come con qualsiasi programmazione multipiattaforma, è limitarsi a utilizzare l'intersezione delle caratteristiche consentite tra i filesystem che hai scelto come target. Guarda anche i problemi di sensibilità alla cassa.