Pergunta

Como posso saber em JavaScript o separador de caminho é usado no OS onde o script está runnning?

Foi útil?

Solução

afair você sempre pode usar / como um separador de caminho, mesmo no Windows.

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

Assim, a situação pode ser resumida bastante simples:

  • Todos os serviços do DOS desde DOS 2.0 e todas as APIs do Windows aceitar tanto para a frente barra ou barra invertida. Sempre tem.

  • Nenhum dos shells de comando padrão (CMD ou comando) aceitará a frente barras. Mesmo o "cd ./tmp" exemplo dada em um post anterior falhar.

Outras dicas

Use path módulo em node.js retorna o separador de arquivo específico da plataforma.
exemplo

path.sep  // on *nix evaluates to a string equal to "/"

Edit: Como pelo comentário de Sebas abaixo, para usar isso, você precisa adicionar isso no topo do seu arquivo js:

const path = require('path')

A resposta correta

Sim todos os sistemas operacionais aceitar CD ../ ou CD .. \ ou CD .. independentemente de como você passar em separadores. Mas o que sobre a leitura de um back caminho. Como você poderia saber se uma palavra a dizer, um caminho 'janelas', com ' ' e \ permitido.

O Obvious 'Duh!' Pergunta

O que acontece quando você depende, por exemplo, o diretório de instalação %PROGRAM_FILES% (x86)\Notepad++. Tome o exemplo a seguir.

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);
    }
}

O que aconteceu!?

targetDir está a ser definida como uma subsequência entre o 0 índices, e 0 (indexOf('/') é -1 em C:\Program Files\Notepad\Notepad++.exe), resultando numa cadeia de vazio.

A Solução ...

Isto inclui código da seguinte mensagem: Como faço para determinar o sistema operacional atual com Node.js

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

Detecção do lado do servidor do OS.

// 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; }

Detecção lado do browser do OS

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;

Helper função para obter o 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...

Função auxiliar para obter o diretório pai (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() deve ser suficiente inteligente para saber qual a sua procura.

Você pode obter ainda realmente liso e verifique se ambos se o usuário está introduzindo um caminho através da linha 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);

Você também pode usar o módulo 'caminho' e path.sep como dito acima, se você quiser carregar um módulo para fazer este simples de uma tarefa. Pessoalmente, eu acho que suficiente para apenas verificar as informações do processo que já está disponível para você.

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

e isso é tudo pessoal!

A resposta de VVS é correta, com exceção de analisar um caminho dado por uma entrada de arquivo no Internet Explorer (testado com IE8 - Eu não sei sobre outras versões). Neste caso, o caminho dado pelo valor do elemento de entrada (input.value) está na forma "C: \ fakepath \ ". Observe as barras invertidas aqui.

Apenas use "/", ele funciona em todos os sistemas operacionais de, tanto quanto eu sei.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top