Come determinare il separatore del percorso del sistema operativo in JavaScript?
-
02-07-2019 - |
Domanda
Come posso sapere in JavaScript quale separatore di percorso viene utilizzato nel sistema operativo in cui è in esecuzione lo script?
Soluzione
Puoi sempre usare / come separatore di percorso, anche su Windows.
Citazione da http://bytes.com/forum/thread23123.html :
Quindi, la situazione può essere riassunta piuttosto semplicemente:
Tutti i servizi DOS dal DOS 2.0 e tutte le API di Windows accettano entrambi i forward barra o barra rovesciata. Sempre.
Nessuna delle shell dei comandi standard (CMD o COMMAND) accetterà l'inoltro barre. Anche il & Quot; cd ./tmp" esempio indicato in un post precedente non riesce.
Altri suggerimenti
Utilizza path
in node.js
restituisce la piattaforma specifica separatore di file.
Esempio
path.sep // on *nix evaluates to a string equal to "/"
Modifica: secondo il commento di Sebas di seguito, per utilizzare questo, è necessario aggiungere questo nella parte superiore del file js:
const path = require('path')
La risposta corretta
Sì tutti i sistemi operativi accettano CD ../ o CD .. \ o CD .. indipendentemente da come si passa nei separatori. Ma per quanto riguarda la lettura di un percorso indietro. Come faresti a sapere se si dice, un percorso 'windows', con ' '
e \
consentiti.
L'ovvio 'Duh!' Domanda
Cosa succede quando si dipende, ad esempio, dalla directory di installazione %PROGRAM_FILES% (x86)\Notepad++
. Prendi il seguente esempio.
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);
}
}
Che cosa è successo !?
targetDir
viene impostato su una sottostringa tra gli indici 0
e indexOf('/')
(-1
è C:\Program Files\Notepad\Notepad++.exe
in getDir()
), con conseguente stringa vuota.
La soluzione ...
Questo include il codice dal seguente post: Come posso determinare l'attuale sistema operativo con Node.js
myGlobals = { isWin: false, isOsX:false, isNix:false };
Rilevamento lato server del sistema operativo.
// 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; }
Rilevamento lato browser del sistema operativo
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;
Funzione di aiuto per ottenere il separatore
function getPathSeparator(){
if(myGlobals.isWin){
return '\\';
}
else if(myGlobals.isOsx || myGlobals.isNix){
return '/';
}
// default to *nix system.
return '/';
}
// modifying our getDir method from above...
Funzione di supporto per ottenere la directory principale (multipiattaforma)
function getDir(filePath){
if(filePath !== '' && filePath != null){
// this will fail on Windows, and work on Others
return filePath.substring(0, filePath.lastIndexOf(getPathSeparator()) + 1);
}
}
<=> deve essere abbastanza intelligente da sapere quale sta cercando.
Puoi anche ottenere davvero agevole e controllare entrambi se l'utente sta inserendo un percorso dalla riga di comando, ecc.
// 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);
Puoi anche usare il modulo 'path' e path.sep come indicato sopra, se vuoi caricare un modulo per fare questo semplice compito. Personalmente, penso che sia sufficiente controllare le informazioni dal processo che sono già disponibili per te.
var path = require('path');
var fileSep = path.sep; // returns '\\' on windows, '/' on *nix
E questo è tutto!
La risposta di VVS è corretta, ad eccezione dell'analisi di un percorso fornito da un input di file in Internet Explorer (testato con IE8 - Non conosco altre versioni). In questo caso, il percorso indicato dal valore dell'elemento di input (input.value) è nella forma & Quot; C: \ fakepath \ & Lt; nome file & Gt; & Quot ;. Nota le barre rovesciate qui.
Usa " / " funziona su tutti i sistemi operativi per quanto ne so.