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é ?
Réponses
Trop de publicités?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')
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.
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 !
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
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.
- Réponses précédentes
- Plus de réponses