Pregunta

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

¿Fue útil?

Solución

Es cierto que siempre puedes usar / como separador de ruta, incluso en Windows.

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

Entonces, la situación se puede resumir simplemente:

  • Todos los servicios de DOS desde DOS 2.0 y todas las API de Windows aceptan barras de reenvío o barra invertida.Siempre tengo.

  • Ninguno de los shells de comando estándar (CMD o comando) aceptará barras de reenvío.Incluso el ejemplo "CD ./TMP" dado en una publicación anterior falla.

Otros consejos

Usar path módulo 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, debe agregar esto en la parte superior de su archivo js:

const path = require('path')

La respuesta correcta

todos los sistemas operativos aceptan CD ../ o CD ..\ o CD ..independientemente de cómo pases los separadores.Pero ¿qué tal leer un camino de regreso?¿Cómo sabrías si se trata de una ruta de 'ventanas', con ' ' y \ permitido.

El obvio '¡Duh!' Pregunta

¿Qué sucede cuando dependes, por ejemplo, del directorio de instalación? %PROGRAM_FILES% (x86)\Notepad++.Tomemos 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 en 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 el 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 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 por parte 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 qué está buscando.

Puedes incluso ser realmente hábil y verificar ambos si el usuario ingresa 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 ruta.sep como se indicó anteriormente, si desea cargar un módulo para realizar una tarea tan simple.Personalmente, creo que basta con comprobar 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 amigos!

La respuesta de VVS es correcta, con la excepción de analizar una ruta proporcionada por una entrada de archivo en Internet Explorer (probado con IE8; no conozco otras versiones).En este caso, la ruta proporcionada por el valor del elemento de entrada (input.value) tiene el formato "C:\fakepath\<nombre de archivo>".Tenga en cuenta las barras invertidas aquí.

Simplemente use "/", hasta donde yo sé, funciona en todos los sistemas operativos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top