Jak mogę sprawdzić w JavaScript, który separator ścieżki jest używany w systemie operacyjnym, w którym skrypt jest uruchomiony?
javascript
file
directory
Ostry ból
źródło
źródło
Odpowiedzi:
Tak, zawsze możesz użyć / jako separatora ścieżki, nawet w systemie Windows.
Cytat z http://bytes.com/forum/thread23123.html :
źródło
Użyj
path
modułu wnode.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')
źródło
path.sep
.const path = require('path');
Poprawna odpowiedź
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.Oczywiste „Duh!” Pytanie
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); } }
Co się stało!?
targetDir
jest ustawiana na podłańcuch między indeksami0
i0
(indexOf('/')
jest-1
wC:\Program Files\Notepad\Notepad++.exe
), co skutkuje pustym ciągiem.Rozwiązanie...
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
I to wszystko!
źródło
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
źródło
Po prostu użyj "/", to działa na wszystkich systemach operacyjnych, o ile wiem.
źródło
determine
, a nie jaki operator działa wszędzie :-)