Wie bestimme ich das OS-Pfadtrennzeichen in JavaScript?

80

Wie kann ich in JavaScript feststellen, welches Pfadtrennzeichen in dem Betriebssystem verwendet wird, in dem das Skript ausgeführt wird?

Stich
quelle
Warum benötigen Sie dies, wenn Javascript im Browser mit vollständiger Betriebssystemisolierung ausgeführt wird? Sie können nicht von Ihrem lokalen Computer aus auf Dateien zugreifen ...
lms
JavaScript wird normalerweise, aber nicht immer, im Browser ausgeführt. Einige Beispiele für die Verwendung von JavaScript außerhalb des Browsers sind Mozilla XULRunner-Apps, JS-Skripte, die mit einem Befehlszeileninterpreter wie V8 oder WSH ausgeführt werden, und in JScript geschriebene ASP-Seiten. Es gibt viele Verwendungsmöglichkeiten für JS.
Joel Anair
Ich bin sicher, dass Sie das Problem bereits gelöst haben, aber ich habe unten einen Anwendungsfall für Ihre Frage und eine Antwort hinzugefügt, da ich wie Sie weiß, dass es immer einen Fall gibt, in dem Sie sich nicht auf das Betriebssystem verlassen können, um das Problem zu lösen Trennzeichen für Sie! :). Prost!
Entschlüsselt
1
Diese Frage ist sehr relevant, da JavaScript häufig in Node.js ausgeführt wird. Dort können und möchten Sie auf das Dateisystem zugreifen, damit das Pfadtrennzeichen eine Rolle spielt. Dies ist auch einer der Schwachpunkte, wenn Sie Node.js-Anwendungen für mehrere Betriebssysteme erstellen möchten. Node.js ist plattformübergreifend, aber das bedeutet nicht, dass ein Node.js-Programm auf allen unterstützten Betriebssystemen ausgeführt wird, ohne dass Sie besonders auf die von Ihnen verwendeten Dateipfade achten.
Panu Logic

Antworten:

20

Sie können / auch unter Windows immer als Pfadtrennzeichen verwenden.

Zitat aus http://bytes.com/forum/thread23123.html :

Die Situation lässt sich also ziemlich einfach zusammenfassen:

  • Alle DOS-Dienste seit DOS 2.0 und alle Windows-APIs akzeptieren entweder Schrägstriche oder Schrägstriche. Immer haben.

  • Keine der Standardbefehls-Shells (CMD oder COMMAND) akzeptiert Schrägstriche. Sogar das Beispiel "cd ./tmp" aus einem früheren Beitrag schlägt fehl.

VVS
quelle
1
Die Antwort von VVS ist korrekt, mit Ausnahme des Parsens eines Pfads, der durch eine Dateieingabe im Internet Explorer angegeben wird (getestet mit IE8 - ich kenne keine anderen Versionen). In diesem Fall hat der Pfad, der durch den Wert des Eingabeelements (input.value) angegeben wird, die Form "C: \ fakepath \ & lt; Dateiname & gt;". Beachten Sie die Backslashes hier.
Milagre
JFYI: cmd.exe behandelt "cd / windows" (als Beispiel) korrekt unter Windows XP und Windows 7.
Eugene Mayevski 'Rückruf
2
Dies ist keine vollständig RICHTIGE Antwort auf die gestellte Frage ... siehe "Die richtige Antwort" unten :).
Entschlüsselt
4
Ich habe diese Antwort abgelehnt, weil sie die perfekte Gültigkeit der Frage ignoriert - nämlich, dass es Fälle gibt, in denen Sie das verwendete Pfadtrennzeichen tatsächlich kennen müssen. Wenn Sie beispielsweise einen Pfad in Teile teilen müssen, wird das Trennzeichen verwendet.
MirroredFate
2
@VVS - Funktioniert nicht in Szenarien, in denen Sie beide Arten von Schrägstrichen verwenden (zumindest unter Windows 7). Stellen Sie sich den Fall vor, in dem Sie eine Variable mit __dirname erstellen und dann den Rest des Pfads anhängen müssen. Zum Beispiel: __dirname + '/ images'. In diesem Beispiel verwendet __dirname die betriebssystemspezifischen Schrägstriche. Wenn Sie jedoch versuchen, / images zu verwenden, und Windows verwenden, wird ein Pfad wie c: \ somepath / images angezeigt, der unter Windows nicht funktioniert. Ich bin gerade auf diesen Fall gestoßen, weshalb ich ihn erwähne :).
DCP
152

Verwendung pathModul in node.jskehrt die plattformspezifische Datei Separator.
Beispiel

path.sep  // on *nix evaluates to a string equal to "/"

Bearbeiten: Gemäß dem Kommentar von Sebas unten müssen Sie dies oben in Ihrer js-Datei hinzufügen, um dies zu verwenden:

const path = require('path')
t98907
quelle
2
Sie können Ihre Antwort verbessern, indempath.sep Sie angeben , wie : .
Ionică Bizău
11
const path = require('path');
Sebas
Obwohl ich weiß, dass ich in den meisten, wenn nicht allen Fällen '/' verwenden kann. Wenn ich die Ausgabe zur Rückmeldung oder Protokollierung an die Konsole drucke. Ich verwende gerne dieselben Schrägstriche in einem vollständigen Pfad.
b01
Ich denke oben ist die richtige Antwort und auch die einfachste Lösung. Wie von Sebas ausgeführt, müssen Sie path = require ('path') ausführen, um Zugriff auf das Pfadmodul zu erhalten. Wenn Sie ein Node.programmer sind, selbst Anfänger, wissen Sie das wahrscheinlich bereits.
Panu Logic
6

Die richtige Antwort

Ja, alle Betriebssysteme akzeptieren CD ../ oder CD .. \ oder CD .. unabhängig davon, wie Sie Trennzeichen übergeben. Aber was ist mit einem Rückweg. Wie würden Sie wissen, ob es sich um einen "Windows" -Pfad handelt, mit ' 'und \erlaubt.

Das offensichtliche "Duh!" Frage

Was passiert , wenn Sie sind abhängig von zum Beispiel das Installationsverzeichnis %PROGRAM_FILES% (x86)\Notepad++. Nehmen Sie das folgende Beispiel.

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);
    }
}

Was ist passiert!?

targetDir wird auf einen Teilstring zwischen den Indizes gesetzt 0 und 0( indexOf('/')ist -1in C:\Program Files\Notepad\Notepad++.exe), was zu der leeren Zeichenfolge führt.

Die Lösung...

Dies beinhaltet Code aus dem folgenden Beitrag: Wie bestimme ich das aktuelle Betriebssystem mit Node.js.

myGlobals = { isWin: false, isOsX:false, isNix:false };

Serverseitige Erkennung des Betriebssystems.

// 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; }

Browserseitige Erkennung des Betriebssystems

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;

Hilfsfunktion zum Abrufen des Trennzeichens

function getPathSeparator(){
    if(myGlobals.isWin){
        return '\\';
    }
    else if(myGlobals.isOsx  || myGlobals.isNix){
        return '/';
    }

    // default to *nix system.
    return '/';
}

// modifying our getDir method from above...

Hilfsfunktion zum Abrufen des übergeordneten Verzeichnisses (plattformübergreifend)

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() muss intelligent genug sein, um zu wissen, wonach es sucht.

Sie können sogar richtig schlau werden und prüfen, ob der Benutzer einen Pfad über die Befehlszeile usw. eingibt.

// 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);

Sie können auch das Modul 'path' und path.sep wie oben angegeben verwenden, wenn Sie ein Modul laden möchten, um diese einfache Aufgabe auszuführen. Persönlich halte ich es für ausreichend, nur die Informationen aus dem Prozess zu überprüfen, die Ihnen bereits zur Verfügung stehen.

var path = require('path');
var fileSep = path.sep;    // returns '\\' on windows, '/' on *nix

Und das ist alles Leute!

Entschlüsselt
quelle
-4

Verwenden Sie einfach "/", es funktioniert meines Wissens auf allen Betriebssystemen.

Vincent McNabb
quelle
4
Das OP fragte, wie es geht determine, nicht was der Operator ist, der überall funktioniert :-)
Steel Brain
3
Es funktioniert, wenn Sie einen Pfad analysieren müssen, um etwas zu extrahieren.
Chris Seufert