Est-il sûr de convertir les chemins de fichiers Windows en chemins de fichiers Unix avec un simple remplacement?

12

Par exemple, disons que je l'ai fait pour que tous mes fichiers soient transférés d'une machine Windows vers une machine Unix en tant que telle: C:\test\myFile.txtà {somewhere}/test/myFile.txt(la lettre de lecteur n'est pas pertinente à ce stade).

Actuellement, notre bibliothèque d'utilitaires que nous avons écrite nous-mêmes fournit une méthode qui remplace simplement toutes les barres obliques inverses par des barres obliques:

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

Les barres obliques sont réservées et ne peuvent pas faire partie d'un nom de fichier, la structure du répertoire doit donc être préservée. Cependant, je ne sais pas s'il y a d'autres complications entre Windows et les chemins Unix dont je pourrais avoir à m'inquiéter (par exemple: noms non ascii, etc.)

MxLDevs
la source
4
Faites juste attention aux espaces - placer des espaces dans les noms de dossier Windows est beaucoup plus courant que dans les noms de répertoire unix. En particulier, "\ Program Files" m'obtient tout le temps. Selon la façon dont vous utilisez les chemins, vous devrez peut-être échapper les espaces avec "\".
Rob
1
@delnan pour plus de simplicité, limitons la portée des chemins pour exclure les chemins variables.
MxLDevs
2
@MxyL Le problème ne disparaît pas lorsque vous codez en dur le chemin d'accès au lieu d'utiliser une variable d'environnement. Si vous voulez juste un chemin qui ne saute pas, ça devrait aller. Si vous voulez un chemin significatif, ou si vous voulez interagir avec d'autres logiciels (ou les attentes des utilisateurs ...), vous avez besoin d'appels de jugement par chemin.
1
@delnan Je me concentre principalement sur la production d'un chemin valide, mais c'est un bon point. Les chemins que je convertis doivent être suffisamment simples pour être significatifs en eux-mêmes.
MxLDevs
3
Les barres obliques inverses sont autorisées dans les noms de fichiers sous Linux, donc le remplacement des barres obliques inverses dans un chemin Linux pourrait ajouter des répertoires non valides. Par exemple, /foo\\barn'est pas équivalent à /foo/barLinux.

Réponses:

7

Oui, si vous ne faites que le remplacement sous Windows et désactivez-le lorsque vous exécutez sur d'autres systèmes.

Faire le remplacement sur des systèmes de type Unix est incorrect car il \s'agit d'un caractère valide dans un nom de fichier ou de répertoire sur des plates-formes de type Unix. Sur ces plateformes, uniquement NULet /sont interdits dans les noms de fichiers et de répertoires.

De plus, certaines fonctions de l'API Windows (principalement celles de niveau inférieur) ne permettent pas l'utilisation de barres obliques - les barres obliques inverses doivent être utilisées avec elles.

Demi
la source
4

Oui, mais tout cela est un point discutable. Java convertit de manière transparente les barres obliques en barres obliques inverses sous Windows. Vous pouvez simplement utiliser des barres obliques pour tous les chemins qui sont codés en dur ou stockés dans la configuration et cela fonctionnera pour les deux plates-formes.

Personnellement, j'utilise toujours la barre oblique même sous Windows car ce n'est pas le caractère d'échappement. Que le chemin brut soit en code ou externalisé dans un fichier de propriétés, je l'encode de la même manière.

Essayez! Cela fonctionnera sous Windows. Évidemment, changez le chemin réel en quelque chose qui existe et votre utilisateur a la permission de lire.

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

Bonus: vous pouvez même mélanger des barres obliques dans le même chemin!

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

la source
1
Si vous lisez l'intégralité de ma réponse, vous verrez où je dis que toujours utiliser le séparateur de fichiers Unix fonctionnera correctement aux deux endroits, aucune conversion n'est nécessaire.
La question indique que les fichiers seront transférés et laisse ouverte la façon dont les noms de fichiers sont stockés. J'ai ajouté un commentaire à la question demandant des éclaircissements sur ce point. Sur la base de la réponse, je modifierai ma réponse au besoin.
Il est peu probable que le programme contienne réellement une liste saisie manuellement de tous les fichiers en cours de transfert. Il est beaucoup plus probable qu'un mécanisme automatisé soit utilisé pour énumérer les fichiers. Compte tenu des paramètres du problème tels qu'ils sont énoncés dans la question, ce mécanisme fournit des chemins de style Windows traditionnels. Dans sa forme actuelle, cette réponse dit au PO de résoudre un problème différent à la place sans lui dire comment ni même qu'il devrait transformer le leur en un problème différent.
Eliah Kagan
Veuillez lire mon commentaire précédent.
1
Windows reconnaît à la fois le fowrard et les barres obliques inverses, et il en est ainsi depuis le début de MS-DOS. C'est-à-dire que chaque noyau Microsoft OS a pris en charge le séparateur de barre oblique. Les premiers COMMAND.COMinterprètes avaient une préférence d'exécution: vous pouviez configurer la barre oblique que l'interprète utiliserait pour l'impression et l'analyse.
Kaz
3

Une autre complication sous Windows est qu'il prend également en charge la notation UNC ainsi que les lettres de lecteur traditionnelles.

Un fichier sur un serveur de fichiers distant est accessible en tant que \\server\sharename\path\filename.

Simon B
la source
1
Je pense que c'est la seule préoccupation citée jusqu'à présent qui est en fait un problème pour cette application. S'il y a des chemins UNC impliqués, ils ne peuvent pas être convertis utilement en un chemin de style Unix.
Jules
2

Non. Il y a bien plus de choses à penser que le simple séparateur de chemin (le "\ vs /"). Comme Rob Y le mentionne, il y a comment les espaces sont gérés et leur fréquence élevée dans l'utilisation de Windows. Il existe différents personnages illégaux dans les deux environnements. Il y a la volonté d'Unix d'autoriser presque n'importe quoi lorsqu'il est échappé par un "\" de tête. Windows utilise "" pour gérer les espaces intégrés. Windows utilise UCS-16 et Unix utilise ASCII ou UTF-8.

etc. , etc. , etc.

Mais , pour de nombreuses applications qui peuvent imposer des contraintes sur les chemins d'accès qu'elles doivent manipuler, vous pouvez réellement le faire exactement comme vous le suggérez. Et cela fonctionnera dans au moins un grand nombre de cas, mais pas tous.

Ross Patterson
la source
1
Je ne pense pas que ces préoccupations soient valables pour la question posée. La gestion de l'espace est un problème d'interface utilisateur; Les systèmes Unix peuvent gérer les espaces dans les noms de fichiers aussi bien que Windows. Les caractères illégaux Windows sont un sur-ensemble de ceux Unix. Il ne peut pas y avoir de barres obliques inverses dans les noms de fichiers Windows (autres que les séparateurs de répertoires qui seront convertis). L'utilisation de guillemets pour les espaces intégrés est une préoccupation au niveau de l'interface utilisateur, pas un problème de gestion de fichiers. Le code de conversion est apparemment en Java, il devrait donc gérer automatiquement la conversion UCS16-> UTF8.
Jules
-1

Chaque système d'exploitation Microsoft, à commencer par MS-DOS, a compris, au niveau du noyau, à la fois les barres obliques et les barres obliques inverses .

Par conséquent, sous Windows, vous pouvez convertir librement entre eux; les deux ont le même statut que les séparateurs réservés. Dans n'importe quel chemin valide, vous pouvez remplacer les barres obliques inverses par des barres obliques et vice versa, sans changer sa signification, en ce qui concerne le noyau.

Dans les premières versions de DOS, l' command.cominterpréteur de Microsoft en faisait une préférence configurable, la barre oblique étant utilisée pour afficher et analyser les chemins. Cela a finalement été supprimé.

Certains programmes de l'espace utilisateur dans Windows tels que, oh, le shell Windows ( explorer.exe) n'aiment pas les barres obliques. C'est juste une mauvaise programmation dans ces programmes.

Kaz
la source
1
Bien que cela soit vrai, je ne pense pas que cela soit utile pour la question du PO qui (AIUI) impliquait la conversion des noms de chemin existants, qui auraient déjà inclus les barres obliques inverses. Il est très utile pour écrire du code multiplateforme de réaliser que vous pouvez simplement utiliser des barres obliques et les faire fonctionner dans la plupart des contextes, mais dans ce cas, je ne pense pas que cela aide.
Jules
@Jules OP transfère des fichiers depuis Windows. Cette réponse explique qu'il n'y a pas de barre oblique inverse à remplacer. Ils ne sont pas du tout dans le système de fichiers Windows. Tous les chemins sont exprimables avec des barres obliques (et Windows le comprend même).
Kaz