Comment puis-je savoir en JavaScript quel séparateur de chemin est utilisé dans le système d'exploitation où le script s'exécute?
Afair 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 se résumer assez simplement:
Tous les services DOS depuis DOS 2.0 et toutes les API Windows acceptent la barre oblique ou la barre oblique inverse. Toujours avoir.
Aucun des shells de commande standard (CMD ou COMMAND) n'acceptera de barres obliques. Même l'exemple "cd ./tmp" donné dans un article précédent échoue.
Utilisez le module path
dans node.js
renvoie le séparateur de fichiers spécifique à la plate-forme.
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')
Oui tous les systèmes d'exploitation acceptent les CD ../ ou CD ..\ou CD .. quelle que soit la façon dont vous passez dans les séparateurs. Mais qu'en est-il de la lecture d'un chemin de retour. Comment sauriez-vous si son mot à dire, un chemin "windows", avec ' '
Et \
Autorisé.
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);
}
}
targetDir
est défini sur une sous-chaîne entre les indices 0
et 0
(indexOf('/')
est -1
dans C:\Program Files\Notepad\Notepad++.exe
), ce qui entraîne la chaîne vide.
Cela inclut le code du message suivant: Comment puis-je déterminer le système d'exploitation actuel avec Node.js
myGlobals = { isWin: false, isOsX:false, isNix:false };
Détection côté serveur du système d'exploitation.
// 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 OS 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 suffisamment intelligent pour savoir ce qu'il recherche.
Vous pouvez même devenir vraiment lisse et vérifier les deux si l'utilisateur entre 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 simple tâche. 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
La réponse de VVS est correcte, à l'exception de l'analyse d'un chemin donné par une entrée de fichier dans Internet Explorer (testé avec IE8 - je ne connais pas les autres versions). Dans ce cas, le chemin d'accès donné par la valeur de l'élément d'entrée (input.value) est au format "C:\fakepath\<filename>". Notez les barres obliques inverses ici.
Utilisez simplement "/", cela fonctionne sur tous les systèmes d'exploitation pour autant que je sache.