web-dev-qa-db-ja.com

JavaScriptでOSパスセパレーターを決定する方法

スクリプトが実行されているOSで使用されているパス区切り文字をJavaScriptでどのように確認できますか?

54
Pawel Pojawa

Windowsでも、パス区切り文字として常に/を使用できます。

http://bytes.com/forum/thread23123.html からの引用:

そのため、状況は簡単に要約できます。

  • DOS 2.0以降のすべてのDOSサービスおよびすべてのWindows APIは、スラッシュまたはバックスラッシュを受け入れます。いつももっている。

  • 標準コマンドシェル(CMDまたはCOMMAND)はいずれもスラッシュを受け入れません。前の投稿で示した「cd ./tmp」の例でも失敗します。

17
VVS

pathnode.jsのモジュールを使用すると、プラットフォーム固有のファイル区切り文字が返されます。

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

編集:以下のSebasのコメントに従って、これを使用するには、jsファイルの先頭にこれを追加する必要があります。

const path = require('path')
110
t98907

正解

はい すべてのOSは、セパレータを渡す方法に関係なく、CD ../またはCD .. \またはCD ..を受け入れます。しかし、パスを読み返すのはどうでしょう。 ' '\が許可されている「windows」パスと言うのであれば、どのように知っていますか?.

明白な「ダウ!」質問

たとえば、インストールディレクトリ%PROGRAM_FILES% (x86)\Notepad++に依存している場合はどうなりますか。次の例をご覧ください。

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は、インデックス00の間の部分文字列に設定されており(indexOf('/')-1C:\Program Files\Notepad\Notepad++.exeです)、空の文字列になります。

ソリューション...

これには、次の投稿のコードが含まれます。 Node.jsを使用して現在のオペレーティングシステムを確認する方法

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

OSのサーバー側の検出。

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

OSのブラウザー側の検出

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;

セパレーターを取得するヘルパー関数

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

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

// modifying our getDir method from above...

親ディレクトリを取得するヘルパー関数(クロスプラットフォーム)

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()は、どれを探しているかを知るのに十分なインテリジェントでなければなりません。

ユーザーがコマンドラインなどを介してパスを入力している場合、本当に滑らかになり、両方をチェックすることもできます。

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

この単純なタスクを実行するためにモジュールをロードする場合は、上記の「path」モジュールとpath.sepを使用することもできます。個人的には、すでに利用可能なプロセスの情報を確認するだけで十分だと思います。

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

そして、それはすべての人々です!

6
Decoded

VVSの答えは正しいですが、Internet Explorerで入力されたファイルで指定されたパスを解析することを除きます(IE8でテスト済み-他のバージョンについては知りません)。この場合、入力要素の値(input.value)で指定されたパスは、「C:\ fakepath\<filename>」という形式になります。ここでバックスラッシュに注意してください。

4
Milagre

「/」を使用するだけで、私の知る限りすべてのOSで動作します。

1
Vincent McNabb