¿Es seguro convertir rutas de archivos de Windows a rutas de archivos Unix con un simple reemplazo?

12

Entonces, por ejemplo, digamos que lo tenía para que todos mis archivos se transfieran de una máquina Windows a una máquina Unix como tal: C:\test\myFile.txtto {somewhere}/test/myFile.txt(la letra de la unidad es irrelevante en este punto).

Actualmente, nuestra biblioteca de utilidades que escribimos nosotros mismos proporciona un método que reemplaza de manera simple todas las barras diagonales inversas por barras diagonales:

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

Las barras inclinadas están reservadas y no pueden formar parte del nombre de un archivo, por lo que la estructura del directorio debe conservarse. Sin embargo, no estoy seguro de si hay otras complicaciones entre ventanas y rutas de Unix de las que deba preocuparme (p. Ej., Nombres que no sean ascii, etc.)

MxLDevs
fuente
44
Solo tenga cuidado con los espacios: poner espacios en los nombres de las carpetas de Windows es mucho más común que en los nombres de directorio de Unix. En particular, "\ Archivos de programa" me afecta todo el tiempo. Dependiendo de cómo esté utilizando las rutas, es posible que deba escapar de espacios con "\".
Rob
1
@delnan por simplicidad, limitemos el alcance de las rutas para excluir rutas variables.
MxLDevs
2
@MxyL El problema no desaparece cuando codifica la ruta en lugar de utilizar una variable de entorno. Si solo quieres un camino que no explote, deberías estar bien. Si desea una ruta significativa, o si desea interactuar con otro software (o las expectativas del usuario ...) necesita llamadas de juicio por ruta.
1
@delnan Estoy enfocado principalmente en producir una ruta válida, pero ese es un buen punto. Los caminos que estoy convirtiendo deben ser lo suficientemente simples como para que sean significativos por sí mismos.
MxLDevs
3
Se permiten barras diagonales inversas en los nombres de archivo en Linux, por lo que reemplazar las barras diagonales inversas en una ruta de Linux podría agregar directorios no válidos. Por ejemplo, /foo\\barno es equivalente a /foo/baren Linux.

Respuestas:

7

Sí, si solo realiza el reemplazo en Windows y lo apaga cuando se ejecuta en otros sistemas.

Hacer el reemplazo en sistemas similares a Unix es incorrecto porque \es un carácter válido en un archivo o nombre de directorio en plataformas similares a Unix. En estas plataformas, solo NULy /están prohibidos en los nombres de archivos y directorios.

Además, algunas funciones de la API de Windows (principalmente las de nivel inferior) no permiten el uso de barras diagonales; las barras diagonales inversas deben usarse con ellas.

Demi
fuente
4

Sí, pero todo esto es un punto discutible. Java convierte perfectamente las barras diagonales en barras diagonales en Windows. Simplemente puede usar barras diagonales para todas las rutas que están codificadas o almacenadas en la configuración y funcionará para ambas plataformas.

En lo personal, yo siempre uso la barra diagonal incluso en Windows, ya que es no el carácter de escape. Ya sea que la ruta sin procesar esté en código o externa en un archivo de propiedades, la codifico de la misma manera.

¡Intentalo! Esto funcionará en Windows. Obviamente, cambie la ruta real a algo que exista y su usuario tenga permiso para leer.

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

Bonificación: ¡incluso puedes mezclar barras en el mismo camino!

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

fuente
1
Si lees toda mi respuesta, verás dónde digo que siempre usar el separador de archivos de Unix funcionará correctamente en ambos lugares, sin necesidad de conversión.
La pregunta establece que los archivos se transferirán y deja abierta la forma en que se almacenan los nombres de los archivos . Agregué un comentario a la pregunta pidiendo aclaraciones sobre ese punto. Según la respuesta, editaré mi respuesta según corresponda.
Es bastante improbable que el programa contenga realmente una lista ingresada manualmente de todos los archivos que se transfieren. Es mucho más probable que se esté utilizando algún mecanismo automatizado para enumerar los archivos. Dados los parámetros del problema tal como se indican en la pregunta, este mecanismo ofrece rutas tradicionales al estilo de Windows. En su forma actual, esta respuesta le dice al OP que resuelva un problema diferente en lugar de decirles cómo o incluso que deberían transformar el suyo en un problema diferente.
Eliah Kagan
Por favor lea mi comentario anterior.
1
Windows reconoce tanto fowrard como barras invertidas, y ha sido así desde principios de MS-DOS. Es decir, cada núcleo del sistema operativo de Microsoft ha tenido soporte de separador de barra diagonal. Los primeros COMMAND.COMintérpretes tenían una preferencia de tiempo de ejecución: podía configurar qué barra utilizaría el intérprete para imprimir y analizar.
Kaz
3

Otra complicación en Windows es que también admite la notación UNC y las letras de unidad tradicionales.

Se puede acceder a un archivo en un servidor de archivos remoto como \\server\sharename\path\filename.

Simon B
fuente
1
Creo que esta es la única preocupación citada hasta ahora que en realidad es un problema para esta aplicación. Si hay rutas UNC involucradas, no se pueden convertir de manera útil en una ruta estilo Unix.
Julio
2

No. Hay muchas más cosas en las que pensar que solo el separador de ruta (la cosa "\ vs /"). Como menciona Rob Y, hay cómo se manejan los espacios y su alta frecuencia en el uso de Windows. Hay diferentes caracteres ilegales en los dos entornos. Existe la voluntad de Unix de permitir casi cualquier cosa cuando se escapa por un "\" líder. Hay un uso de Windows de '"' para tratar con espacios incrustados. Hay un uso de Windows de UCS-16 y el uso de ASCII o UTF-8 de Unix.

etc. , etc. , etc.

Pero , para muchas aplicaciones que pueden imponer restricciones a los nombres de ruta que necesitan manipular, en realidad puede hacerlo de la manera que sugiere. Y funcionará en al menos un gran número de casos, pero no en todos.

Ross Patterson
fuente
1
No creo que estas preocupaciones sean válidas para la pregunta planteada. El manejo del espacio es un problema de la interfaz de usuario; Los sistemas Unix pueden manejar espacios en nombres de archivos tan bien como Windows. Los caracteres ilegales de Windows son un superconjunto de los Unix. No puede haber barras invertidas en los nombres de archivo de Windows (aparte de los separadores de directorio que se convertirán). El uso de comillas para espacios incrustados es una preocupación de nivel de interfaz de usuario, no un problema de manejo de archivos. El código de conversión aparentemente está en Java, por lo que debe manejar la conversión UCS16-> UTF8 automáticamente.
Julio
-1

Todos los sistemas operativos de Microsoft, comenzando con MS-DOS, han entendido, a nivel del núcleo, tanto las barras diagonales como las barras diagonales inversas .

Por lo tanto, en Windows, puede convertir entre ellos libremente; ambos tienen el mismo estado que los separadores reservados. En cualquier ruta válida, puede reemplazar las barras diagonales inversas con barras diagonales y viceversa, sin cambiar su significado, en lo que respecta al núcleo.

En las primeras versiones de DOS, el command.comintérprete de Microsoft lo convertía en una preferencia configurable que se utilizaba para mostrar y analizar rutas. Eso finalmente fue eliminado.

Algunos programas de espacio de usuario en Windows como, oh, el shell de Windows ( explorer.exe) no les gustan las barras diagonales. Eso es simplemente una mala programación en esos programas.

Kaz
fuente
1
Si bien esto es cierto, no creo que sea útil para la pregunta del OP que (AIUI) implicó la conversión de nombres de ruta existentes, que ya habrían incluido las barras diagonales inversas en ellos. Que es muy útil para escribir código de plataforma cruzada para darse cuenta de que sólo puede utilizar barras diagonales y hacer que trabajen en la mayoría de los contextos, pero en este caso no creo que ayuda.
Julio
@Jules OP está transfiriendo archivos desde Windows. Esta respuesta explica que no hay barras invertidas para reemplazar. No están en el sistema de archivos de Windows en absoluto. Todas las rutas son expresables con barras diagonales (y Windows incluso lo entiende).
Kaz