Jak mogę sprawdzić w JavaScript, który separator ścieżki jest używany w systemie operacyjnym, w którym skrypt jest uruchomiony?
Jak mogę sprawdzić w JavaScript, który separator ścieżki jest używany w systemie operacyjnym, w którym skrypt jest uruchomiony?
Odpowiedzi:
Tak, zawsze możesz użyć / jako separatora ścieżki, nawet w systemie Windows.
Cytat z http://bytes.com/forum/thread23123.html :
Sytuację można więc podsumować dość prosto:
Wszystkie usługi DOS od DOS 2.0 i wszystkie interfejsy API Windows akceptują ukośnik lub lewy ukośnik. Zawsze ma.
Żadna ze standardowych powłok poleceń (CMD lub COMMAND) nie akceptuje ukośników. Nawet przykład „cd ./tmp” podany w poprzednim poście zawodzi.
Użyj path
modułu w node.js
zwraca separator plików specyficzny dla platformy.
przykład
path.sep // on *nix evaluates to a string equal to "/"
Edycja: zgodnie z komentarzem Sebasa poniżej, aby z tego skorzystać, musisz dodać to na górze pliku js:
const path = require('path')
path.sep
.
const path = require('path');
Tak, wszystkie systemy operacyjne akceptują CD ../ lub CD .. \ lub CD .. niezależnie od tego, jak przekazujesz separatory. Ale co z odczytaniem ścieżki wstecz. Skąd możesz wiedzieć, czy to, powiedzmy, ścieżka „okna” z ' '
i \
dozwolona.
Co się dzieje, gdy polegasz na przykład na katalogu instalacyjnym %PROGRAM_FILES% (x86)\Notepad++
. Weźmy następujący przykład.
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
jest ustawiana na podłańcuch między indeksami 0
i 0
( indexOf('/')
jest -1
w C:\Program Files\Notepad\Notepad++.exe
), co skutkuje pustym ciągiem.
Obejmuje to kod z następującego wpisu: Jak określić bieżący system operacyjny za pomocą Node.js.
myGlobals = { isWin: false, isOsX:false, isNix:false };
Wykrywanie systemu operacyjnego po stronie serwera.
// 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; }
Wykrywanie systemu operacyjnego po stronie przeglądarki
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;
Funkcja pomocnicza, aby uzyskać separator
function getPathSeparator(){
if(myGlobals.isWin){
return '\\';
}
else if(myGlobals.isOsx || myGlobals.isNix){
return '/';
}
// default to *nix system.
return '/';
}
// modifying our getDir method from above...
Funkcja pomocnicza, aby uzyskać katalog nadrzędny (między platformami)
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()
musi być wystarczająco inteligentny, aby wiedzieć, czego szuka.
Możesz uzyskać nawet naprawdę sprytny i sprawdzić oba, czy użytkownik wprowadza ścieżkę za pomocą wiersza poleceń itp.
// 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);
Możesz także użyć „path” module i path.sep, jak wspomniano powyżej, jeśli chcesz załadować moduł, aby wykonać to proste zadanie. Osobiście uważam, że wystarczy po prostu sprawdzić informacje z procesu, które są już dostępne.
var path = require('path');
var fileSep = path.sep; // returns '\\' on windows, '/' on *nix
NodeJS
tagu - odpowiedziałeś zarówno po stronie serwera, jak i klienta . Twoja odpowiedź w pełni - i faktycznie - odpowiada na pytanie. W przypadku węzła myślę, że moduł ścieżki jest w porządku, ponieważ nie wpłynie to na wydajność generowanego kodu bajtowego i nie powinno wpływać na czytelność (pojedyncza instrukcja importu). Jednak jesteś jedyną odpowiedzią po stronie klienta. To powinno być zaakceptowane.
Jak już tutaj odpowiedziałem, możesz znaleźć separator ścieżki specyficzny dla systemu operacyjnego, path.join
aby ręcznie utworzyć ścieżkę. Ale możesz też pozwolić path.join
sobie na to, co jest moim preferowanym rozwiązaniem przy konstrukcjach ścieżek:
Przykład:
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
Po prostu użyj "/", to działa na wszystkich systemach operacyjnych, o ile wiem.
determine
, a nie jaki operator działa wszędzie :-)