100 votes

Comment déterminer le séparateur de chemin du système d'exploitation en JavaScript ?

Comment puis-je savoir en JavaScript quel séparateur de chemin est utilisé dans le système d'exploitation où le script est exécuté ?

196voto

t98907 Points 11

Utilice path module en node.js renvoie le séparateur de fichiers spécifique à la plate-forme.
ejemplo

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

Edit : Selon le commentaire de Sebas ci-dessous, pour utiliser cette fonction, vous devez ajouter ceci en haut de votre fichier js :

const path = require('path')

26voto

VVS Points 11528

En fait, vous pouvez toujours utiliser / comme séparateur de chemin, même sous Windows.

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

Donc, la situation peut être résumée assez simplement :

  • Tous les services DOS depuis DOS 2.0 et toutes les API Windows acceptent soit le forward ou la barre oblique inversée. C'est toujours le cas.

  • Aucun des interpréteurs de commandes standard (CMD ou COMMAND) n'accepte les commandes de type "forward". avant. Même l'exemple "cd ./tmp" donné dans un post précédent donné dans un message précédent ne fonctionne pas.

13voto

Decoded Points 648

La bonne réponse

Oui Tous les systèmes d'exploitation acceptent CD ../ ou CD ..\ ou CD .., quelle que soit la façon dont vous passez les séparateurs. Mais qu'en est-il de la lecture d'un chemin d'accès. Comment savoir s'il s'agit, par exemple, d'un chemin d'accès 'Windows', avec ' ' y \ autorisé.

La question évidente "Duh ! Question

Que se passe-t-il lorsque vous dépendez, par exemple, du répertoire d'installation %PROGRAM_FILES% (x86)\Notepad++ . Prenons l'exemple suivant.

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 s'est-il passé ?

targetDir est défini comme une sous-chaîne entre les indices 0 y 0 ( indexOf('/') est -1 sur C:\Program Files\Notepad\Notepad++.exe ), ce qui donne lieu à la chaîne vide.

La solution...

Ceci inclut le code du post suivant : Comment déterminer le système d'exploitation actuel avec Node.js ?

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

Détection de l'OS côté serveur.

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

Détection de l'OS du côté du navigateur

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;

Fonction d'aide pour obtenir le séparateur

function getPathSeparator(){
    if(myGlobals.isWin){
        return '\\';
    }
    else if(myGlobals.isOsx  || myGlobals.isNix){
        return '/';
    }

    // default to *nix system.
    return '/';
}

// modifying our getDir method from above...

Fonction d'aide pour obtenir le répertoire parent (multiplateforme)

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() doit être assez intelligent pour savoir ce qu'il cherche.

Vous pouvez être encore plus malin et vérifier les deux si l'utilisateur saisit un chemin via la ligne de commande, 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);

Vous pouvez également utiliser le module 'path' et path.sep comme indiqué ci-dessus, si vous souhaitez charger un module pour effectuer cette tâche simple. Personnellement, je pense qu'il suffit de vérifier les informations du processus qui sont déjà à votre disposition.

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

Et c'est tout, les amis !

7voto

Benny Neugebauer Points 5393

Comme déjà répondu ici, vous pouvez trouver le séparateur de chemin spécifique au système d'exploitation avec path.sep pour construire manuellement votre chemin. Mais vous pouvez également laisser path.join font l'affaire, ce qui est ma solution préférée lorsqu'il s'agit de construire des chemins :

Exemple :

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

2voto

Milagre Points 21

La réponse de VVS est correcte, à l'exception du parsing d'un chemin donné par un fichier en entrée dans internet explorer (testé avec IE8 - je ne connais pas les autres versions). Dans ce cas, le chemin donné par la valeur de l'élément d'entrée (input.value) est de la forme " C:\fakepath\ <filename>". Notez les barres obliques inversées ici.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X