¿Cómo puedo saber en JavaScript qué separador de ruta se usa en el sistema operativo donde se ejecuta el script?
javascript
file
directory
Angustia
fuente
fuente
Respuestas:
Es cierto que siempre puede usar / como separador de ruta, incluso en Windows.
Cita de http://bytes.com/forum/thread23123.html :
fuente
Use
path
module innode.js
devuelve el separador de archivos específico de la plataforma.ejemplo
path.sep // on *nix evaluates to a string equal to "/"
Editar: según el comentario de Sebas a continuación, para usar esto, debe agregar esto en la parte superior de su archivo js:
const path = require('path')
fuente
path.sep
.const path = require('path');
La respuesta correcta
Sí, todos los sistemas operativos aceptan CD ../ o CD .. \ o CD .. independientemente de cómo se pasen los separadores. Pero, ¿qué hay de leer un camino de regreso? ¿Cómo sabría si se dice, una ruta de 'ventanas', con
' '
y\
permitido.El obvio '¡Duh!' Pregunta
Qué sucede cuando depende, por ejemplo, del directorio de instalación
%PROGRAM_FILES% (x86)\Notepad++
. Tome el siguiente ejemplo.var fs = require('fs'); // file system module var targetDir = 'C:\Program Files (x86)\Notepad++'; // target installer dir // read all files in the directory fs.readdir(targetDir, function(err, files) { if(!err){ for(var i = 0; i < files.length; ++i){ var currFile = files[i]; console.log(currFile); // ex output: 'C:\Program Files (x86)\Notepad++\notepad++.exe' // attempt to print the parent directory of currFile var fileDir = getDir(currFile); console.log(fileDir); // output is empty string, ''...what!? } } }); function getDir(filePath){ if(filePath !== '' && filePath != null){ // this will fail on Windows, and work on Others return filePath.substring(0, filePath.lastIndexOf('/') + 1); } }
¿¡Que pasó!?
targetDir
se establece en una subcadena entre los índices0
y0
(indexOf('/')
está-1
enC:\Program Files\Notepad\Notepad++.exe
), lo que da como resultado la cadena vacía.La solución...
Esto incluye código de la siguiente publicación: ¿Cómo determino el sistema operativo actual con Node.js?
myGlobals = { isWin: false, isOsX:false, isNix:false };
Detección de SO del lado del servidor.
// this var could likely a global or available to all parts of your app if(/^win/.test(process.platform)) { myGlobals.isWin=true; } else if(process.platform === 'darwin'){ myGlobals.isOsX=true; } else if(process.platform === 'linux') { myGlobals.isNix=true; }
Detección del sistema operativo en el lado del navegador
var appVer = navigator.appVersion; if (appVer.indexOf("Win")!=-1) myGlobals.isWin = true; else if (appVer.indexOf("Mac")!=-1) myGlobals.isOsX = true; else if (appVer.indexOf("X11")!=-1) myGlobals.isNix = true; else if (appVer.indexOf("Linux")!=-1) myGlobals.isNix = true;
Función auxiliar para obtener el separador
function getPathSeparator(){ if(myGlobals.isWin){ return '\\'; } else if(myGlobals.isOsx || myGlobals.isNix){ return '/'; } // default to *nix system. return '/'; } // modifying our getDir method from above...
Función auxiliar para obtener el directorio principal (multiplataforma)
function getDir(filePath){ if(filePath !== '' && filePath != null){ // this will fail on Windows, and work on Others return filePath.substring(0, filePath.lastIndexOf(getPathSeparator()) + 1); } }
getDir()
debe ser lo suficientemente inteligente para saber cuál está buscando.Puede ser incluso realmente hábil y verificar ambos si el usuario está ingresando una ruta a través de la línea de comando, etc.
// in the body of getDir() ... var sepIndex = filePath.lastIndexOf('/'); if(sepIndex == -1){ sepIndex = filePath.lastIndexOf('\\'); } // include the trailing separator return filePath.substring(0, sepIndex+1);
También puede usar el módulo 'ruta' y path.sep como se indicó anteriormente, si desea cargar un módulo para hacer esta simple tarea. Personalmente, creo que es suficiente con verificar la información del proceso que ya está disponible para usted.
var path = require('path'); var fileSep = path.sep; // returns '\\' on windows, '/' on *nix
¡Y eso es todo!
fuente
NodeJS
etiqueta, ha respondido tanto para el servidor como para el cliente . Tu respuesta responde completa y realmente a la pregunta. Para el nodo, creo que el módulo de ruta está bien porque no afectará el rendimiento del código de bytes generado y no debería afectar la legibilidad (una sola declaración de importación). Sin embargo, eres la única respuesta del lado del cliente. Este debería ser el aceptado.Como ya se respondió aquí, puede encontrar el separador de ruta específico del sistema operativo
path.join
para construir manualmente su ruta. Pero también puede dejarpath.join
hacer el trabajo, que es mi solución preferida cuando se trata de construcciones de rutas:Ejemplo:
const path = require('path'); const directory = 'logs'; const file = 'data.json'; const path1 = `${directory}${path.sep}${file}`; const path2 = path.join(directory, file); console.log(path1); // Shows "logs\data.json" on Windows console.log(path2); // Also shows "logs\data.json" on Windows
fuente
Solo use "/", funciona en todos los sistemas operativos que yo sepa.
fuente
determine
, no cuál es el operador que trabaja en todas partes :-)