¿Cómo puedo saber en JavaScript qué separador de ruta se usa en el sistema operativo donde se ejecuta el script?
¿Cómo puedo saber en JavaScript qué separador de ruta se usa en el sistema operativo donde se ejecuta el script?
Respuestas:
Es cierto que siempre puede usar / como separador de ruta, incluso en Windows.
Cita de http://bytes.com/forum/thread23123.html :
Entonces, la situación se puede resumir de manera bastante simple:
Todos los servicios de DOS desde DOS 2.0 y todas las API de Windows aceptan barra diagonal o barra invertida. Siempre tengo.
Ninguno de los shells de comando estándar (CMD o COMMAND) aceptará barras diagonales. Incluso el ejemplo "cd ./tmp" dado en una publicación anterior falla.
Use path
module in node.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')
path.sep
.
const path = require('path');
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.
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);
}
}
targetDir
se establece en una subcadena entre los índices 0
y 0
( indexOf('/')
está -1
en C:\Program Files\Notepad\Notepad++.exe
), lo que da como resultado la cadena vacía.
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
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 dejar path.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
Solo use "/", funciona en todos los sistemas operativos que yo sepa.
determine
, no cuál es el operador que trabaja en todas partes :-)