Búsqueda de sitios web

archivo - ¿Cómo determinar el separador de rutas del sistema operativo en JavaScript?


¿Cómo puedo saber en JavaScript qué separador de ruta se utiliza en el sistema operativo donde se está ejecutando el script?

Respuesta #1

Usar el módulo path en 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, necesitas agregar esto al principio de tu archivo js:

const path = require('path')

Respuesta #2

Según recuerdo, siempre puedes usar/como separador de rutas, incluso en Windows.

Cita de http://bytes.com/forum/thread23123.html:

Entonces, la situación se puede resumir bastante fácilmente:

  • Todos los servicios de DOS desde DOS 2.0 y todas las API de Windows aceptan tanto la barra inclinada hacia adelante como la barra invertida. Siempre lo han hecho.

  • Ninguno de los intérpretes de comandos estándar (CMD o COMMAND) aceptará barras diagonales hacia adelante. Incluso el ejemplo "cd ./tmp" dado en un mensaje anterior falla.

Respuesta #3

La respuesta correcta

Sí, todos los sistemas operativos aceptan CD ../ o CD ..\ o CD .. sin importar cómo pases los separadores. Pero, ¿qué pasa al leer una ruta? ¿Cómo sabrías si es, digamos, una ruta 'de Windows', con ' ' y \ permitidos?

La pregunta obvia '¡Duh!'

Qué sucede cuando dependes, por ejemplo, del directorio de instalación %PROGRAM_FILES% (x86)\Notepad++. Toma 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);
    }
}

¿Qué pasó?

targetDir se está estableciendo como una subcadena entre los índices 0 y 0 (indexOf('/') es -1 en C:\Program Files\Notepad\Notepad++.exe), lo que da como resultado la cadena vacía.

La Solución...

Esto incluye código del siguiente artículo: Cómo determino el sistema operativo actual con Node.js

myGlobals = { isWin: false, isOsX:false, isNix:false };

Detección del sistema operativo 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 del 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 como para saber qué está buscando.

Incluso puedes ser realmente astuto y verificar ambos si el usuario está ingresando una ruta a través de la línea de comandos, 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 puedes usar el módulo 'path' y path.sep como se indicó arriba, si quieres cargar un módulo para realizar una tarea tan simple. Personalmente, creo que es suficiente con simplemente verificar la información del proceso que ya está disponible para ti.

var path = require('path');
var fileSep = path.sep;    // returns '\\' on windows, '/' on *nix

¡Y eso es todo, amigos!

Respuesta #4

Como ya se respondió aquí, puedes encontrar el separador de rutas específico del sistema operativo con path.sep para construir tu ruta manualmente. Pero también puedes dejar que path.join haga el trabajo, que es mi solución preferida al tratar con 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

Artículos relacionados