È sicuro convertire i percorsi dei file di Windows in percorsi dei file Unix con una semplice sostituzione?


12

Quindi, ad esempio, supponiamo di averlo fatto in modo che tutti i miei file vengano trasferiti da una macchina Windows a una macchina unix come tale: C:\test\myFile.txta {somewhere}/test/myFile.txt(la lettera di unità è irrilevante a questo punto).

Attualmente, la nostra libreria di utilità che abbiamo scritto da soli fornisce un metodo che sostituisce semplicemente tutte le barre rovesciate con barre rovesciate:

public String normalizePath(String path) {
   return path.replaceAll("\\", "/");
}

Le barre sono riservate e non possono far parte del nome di un file, quindi la struttura della directory deve essere preservata. Tuttavia, non sono sicuro se ci sono altre complicazioni tra finestre e percorsi unix di cui potrei preoccuparmi (ad es. Nomi non ascii, ecc.)


4
Fai attenzione agli spazi: inserire gli spazi nei nomi delle cartelle di Windows è molto più comune rispetto ai nomi delle directory di unix. In particolare, "\ Programmi" mi dà sempre. A seconda di come stai usando i percorsi, potresti dover sfuggire agli spazi con "\".
Rob,

1
@delnan per semplicità, limitiamo l'ambito dei percorsi per escludere percorsi variabili.
MxLDevs

2
@MxyL Il problema non scompare quando si codifica il percorso invece di utilizzare una variabile di ambiente. Se vuoi solo un percorso che non esploda, dovresti stare bene. Se si desidera un percorso significativo o se si desidera interagire con altri software (o aspettative degli utenti ...), è necessario effettuare chiamate di giudizio per percorso.

1
@delnan Sono principalmente concentrato sulla produzione di un percorso valido, ma questo è un buon punto. I percorsi che sto convertendo dovrebbero essere abbastanza semplici da essere significativi da soli.
MxLDevs,

3
Le barre rovesciate sono consentite nei nomi file su Linux, quindi la sostituzione delle barre rovesciate in un percorso Linux potrebbe aggiungere directory non valide. Ad esempio, /foo\\barnon è equivalente a /foo/barsu Linux.

Risposte:


7

Sì, se si esegue la sostituzione solo su Windows e la si spegne quando si esegue su altri sistemi.

Fare la sostituzione su sistemi simili a Unix è sbagliato perché \è un carattere valido in un nome di file o directory su piattaforme simili a Unix. Su queste piattaforme, solo NULe /sono vietati nei nomi di file e directory.

Inoltre, alcune funzioni dell'API di Windows (principalmente quelle di livello inferiore) non consentono l'uso di barre rovesciate: è necessario utilizzare barre rovesciate con esse.


4

Sì, ma tutto questo è un punto controverso. Java converte senza problemi barre rovesciate in barre rovesciate su Windows. Puoi semplicemente usare le barre in avanti per tutti i percorsi che sono codificati o memorizzati nella configurazione e funzionerà per entrambe le piattaforme.

Personalmente, io uso sempre la barra anche su Windows, perché è non è il carattere di escape. Se il percorso non elaborato è nel codice o esternalizzato in un file delle proprietà, lo codifico allo stesso modo.

Provalo! Questo funzionerà in Windows. Ovviamente, cambia il percorso effettivo in qualcosa che esiste e il tuo utente ha il permesso di leggere.

File f = new File("c:/some/path/file.txt");
if (!f.canRead()) {
  System.out.println("Uh oh, Snowman was wrong!");
}

Bonus: puoi anche mescolare le barre nello stesso percorso!

File f = new File("c:/some\\path/file.txt");
if (!f.canRead()) {
  System.out.println("Uh oh, Snowman was wrong again!");
}

1
Se leggessi la mia intera risposta, vedresti dove dico che l' uso sempre del separatore di file Unix funzionerà correttamente in entrambi i posti, nessuna conversione necessaria.

La domanda afferma che i file verranno trasferiti e lascia aperta la modalità di memorizzazione dei nomi dei file . Ho aggiunto un commento alla domanda chiedendo chiarimenti su questo punto. Sulla base della risposta, modificherò la mia risposta come appropriato.

È abbastanza improbabile che il programma contenga effettivamente un elenco inserito manualmente di tutti i file trasferiti. È molto più probabile che venga utilizzato un meccanismo automatizzato per enumerare i file. Dati i parametri del problema come indicato nella domanda, questo meccanismo offre percorsi tradizionali in stile Windows. Nella sua forma attuale, questa risposta sta dicendo all'OP di risolvere un problema diverso invece senza dire loro come o addirittura che dovrebbero trasformare il loro nel diverso problema.
Eliah Kagan,

Si prega di leggere il mio commento precedente.

1
Windows riconosce sia fowrard che backslash ed è stato così sin dai primi MS-DOS. Vale a dire che ogni kernel del sistema operativo Microsoft ha avuto il supporto del separatore di barra. I primi COMMAND.COMinterpreti avevano una preferenza di runtime: potevi configurare quale barra avrebbe usato l'interprete per la stampa e l'analisi.
Kaz,

3

Un'altra complicazione su Windows è che supporta anche la notazione UNC e le tradizionali lettere di unità.

È possibile accedere a un file su un file server remoto come \\server\sharename\path\filename.


1
Penso che questa sia l'unica preoccupazione citata finora che in realtà è un problema per questa applicazione. Se sono coinvolti percorsi UNC, non possono essere convertiti utilmente in un percorso in stile Unix.
Jules l'

2

No. Ci sono molte più cose a cui pensare oltre al semplice separatore di percorso (la cosa "\ vs /"). Come cita Rob Y, ecco come vengono gestiti gli spazi e la loro alta frequenza nell'uso di Windows. Esistono diversi personaggi illegali nei due ambienti. Esiste la volontà di Unix di consentire praticamente qualsiasi cosa quando fuggito da un "\" leader. Esiste l'uso di "" 'da parte di Windows per gestire gli spazi incorporati. Esiste l'utilizzo di UCS-16 da parte di Windows e l'uso di ASCII o UTF-8 da parte di Unix.

ecc , ecc , ecc

Ma , per molte applicazioni che possono mettere dei vincoli sui percorsi che devono manipolare, in realtà puoi farlo proprio come suggerisci. E funzionerà in almeno un gran numero di casi, ma non in tutti.


1
Non credo che queste preoccupazioni siano valide per la domanda posta. La gestione dello spazio è un problema di interfaccia utente; I sistemi Unix sono in grado di gestire gli spazi nei nomi dei file come Windows. I personaggi illegali di Windows sono un superset di quelli Unix. Non ci possono essere barre rovesciate nei nomi dei file di Windows (tranne i separatori di directory che verranno convertiti). L'uso delle virgolette per gli spazi incorporati è un problema a livello di interfaccia utente, non un problema di gestione dei file. Il codice di conversione è apparentemente in Java, quindi dovrebbe gestire automaticamente la conversione UCS16-> UTF8.
Jules l'

-1

Ogni sistema operativo Microsoft, a partire da MS-DOS, ha compreso, a livello di kernel, sia le barre che le barre rovesciate .

Pertanto, su Windows, è possibile convertire liberamente tra loro; entrambi hanno lo stesso status di separatori riservati. In qualsiasi percorso valido, è possibile sostituire le barre rovesciate con barre e viceversa, senza modificarne il significato, per quanto riguarda il kernel.

Nelle prime versioni di DOS, l' command.cominterprete di Microsoft ha reso una preferenza configurabile quale barra veniva utilizzata per visualizzare e analizzare i percorsi. Alla fine è stato rimosso.

Alcuni programmi di spazio utente in Windows come, oh, la shell di Windows ( explorer.exe) non amano le barre in avanti. È solo una programmazione scadente in quei programmi.


1
Sebbene ciò sia vero, non credo sia utile per la domanda del PO che (AIUI) comportava la conversione di nomi di percorso esistenti, che avrebbero già incluso le barre rovesciate in essi. Si è molto utile per la scrittura di codice cross-platform per rendersi conto che si può semplicemente utilizzare slash e farli lavorare nella maggior parte dei contesti, ma in questo caso non credo che aiuta.
Jules l'

@Jules OP sta trasferendo file da Windows. Questa risposta spiega che non ci sono barre rovesciate da sostituire. Non si trovano affatto nel filesystem di Windows. Tutti i percorsi sono espressibili con barre (e Windows lo capisce persino).
Kaz,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.