Comment déterminer le séparateur de chemin du système d'exploitation en JavaScript?
-
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é?
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.