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

StackOverflow https://stackoverflow.com/questions/125813

  •  02-07-2019
  •  | 
  •  

Question

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

Était-ce utile?

La solution

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

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

  

On peut donc résumer la situation   plutôt simplement:

     
      
  • Tous les services DOS depuis DOS 2.0 et toutes les API Windows acceptent les transferts   slash ou backslash. Toujours avoir.

  •   
  • Aucun des shells de commande standard (CMD ou COMMAND) n'acceptera le transfert   slash. Même le & Quot; cd ./tmp" Exemple   donné dans un message précédent échoue.

  •   

Autres conseils

Utiliser le module path dans node.js renvoie le contenu spécifique à la plate-forme. séparateur de fichiers.
exemple

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

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

const path = require('path')

La réponse correcte

Oui tous les systèmes d'exploitation acceptent CD ../ ou CD .. \ ou CD .. quelle que soit la manière dont vous passez les séparateurs. Mais qu'en est-il de lire un chemin en arrière. Comment sauriez-vous si son nom, un chemin "Windows", avec ' ' et \ autorisés.

L'évident "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 sur une sous-chaîne entre les index 0 et indexOf('/') (-1 est C:\Program Files\Notepad\Notepad++.exe dans getDir()), ce qui donne la chaîne vide.

La solution ...

Cela comprend le code du message suivant: Comment déterminer le système d'exploitation actuel avec Node.js

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

Détection du système d'exploitation 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 du système d'exploitation 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'assistance 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'assistance 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);
    }
}

<=> doit être suffisamment intelligent pour savoir quelle recherche.

Vous pouvez même devenir vraiment lisse et vérifier les deux si l'utilisateur entre un chemin via une 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 les modules '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 déjà disponible.

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

Et c'est tout le monde!

La réponse de VVS est correcte, à l'exception de l'analyse d'un chemin donné par un fichier saisi 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 \ & .Fichier & Gt; &". Notez les barres obliques inverses ici.

Il suffit d'utiliser & "; &", cela fonctionne sur tous les systèmes d'exploitation pour autant que je sache.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top