JavaScriptでOSパス区切り文字を決定する方法は?


82

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


Javascriptが完全なOS分離でブラウザ内で実行されているのに、なぜこれが必要なのですか?ローカルコンピュータからファイルにアクセスできません
...– lms

JavaScriptは通常、常にではありませんが、ブラウザで実行されます。ブラウザの外部でJavaScriptを使用する例としては、Mozilla XULRunnerアプリ、V8やWSHなどのコマンドラインインタープリターを使用して実行されるjsスクリプト、JScriptで記述されたASPページなどがあります。JSには多くの用途があります。
Joel Anair 2008

すでに問題は解決していると思いますが、質問のユースケースと回答を以下に追加しました。あなたと同じように、OSに依存して解決できない場合があることを私は知っています。あなたのためのセパレーター!:)。乾杯!
2016

2
JavaScriptはNode.js内で実行されることが多いため、この質問は非常に関連性があります。そこで、パス区切り文字が重要になるように、ファイルシステムにアクセスできます。これは、マルチOSNode.jsアプリケーションを作成する場合の問題点の1つでもあります。Node.jsはマルチプラットフォームですが、使用するファイルパスに特別な注意を払わなくても、サポートされているすべてのOSでNode.jsプログラムが実行されるわけではありません。
パヌロジック2018

回答:


20

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

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

したがって、状況はかなり簡単に要約できます。

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

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


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

JFYI:cmd.exeは、WindowsXPとWindows7の両方で「cd / windows」(例として)を正しく処理します
。– Eugene Mayevski 'コールバック2011

2
これは、提起された質問に対する完全に正しい答えではありません...以下の「正しい答え」を参照してください:)。
2016

5
質問の完全な妥当性を無視しているため、この回答に反対しました。つまり、使用されているパス区切り文字を実際に知る必要がある場合があります。たとえば、パスを分割する必要がある場合は、セパレータを使用します。
MirroredFate 2016

2
@ VVS-両方のタイプのスラッシュを使用するシナリオでは機能しません(少なくともWindows 7では)。__dirnameを使用して変数を作成していて、残りのパスを追加する必要がある場合を考えてみます。例:__ dirname + '/ images'。その例では、__ dirnameはOS固有のスラッシュを使用しますが、/ imagesを使用しようとして、Windowsを使用している場合、c:\ somepath / imagesのようなパスになり、Windowsでは機能しません。私はちょうどこのケースに遭遇しました、それが私がそれについて言及する理由です:)。
dcp 2017年

160

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

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

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

const path = require('path')

2
次の方法を指定してpath.sep、回答改善できます。
IonicăBizău

11
const path = require('path');
セバス2017年

すべてではないにしても、ほとんどの場合、「/」を使用できることはわかっていますが。フィードバックまたはログ記録のために出力をコンソールに出力するとき。フルパスで同じスラッシュを使用するのが好きです。
b 0118年

上記が正解であり、最も簡単な解決策でもあると思います。パスモジュールにアクセスするためにSebasが指摘しているように、path = require( 'path')を実行する必要があります。あなたがNode.programmerであり、初心者であっても、おそらくすでにそれを知っているでしょう。
パヌロジック2018

7

正解

はい、すべてのOSは、セパレータの受け渡し方法に関係なく、CD ../またはCD .. \またはCD ..を受け入れます。しかし、パスを読み戻すのはどうですか。どのように知っているかのその発言、「Windowsのパス、と' '\ができました。

明らかな「Duh!」質問

たとえば、インストールディレクトリに依存するとどうなりますか%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インデックス間のサブストリングに設定され0、そして0indexOf('/')ある-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

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


1
使用するセパレーターを見つけて、それを管理可能なチャンクに分割するためのロジックを提示したのが好きです。これがプロがエンジニアとして働く方法です。そのための+1。また、質問の年齢とNodeJSタグの欠如を考慮して、サーバー側とクライアント側の両方について回答しました。あなたの答えは完全に-そして実際に-質問に答えます。ノードの場合、パスモジュールは、生成されたバイトコードのパフォーマンスに影響を与えず、可読性(単一のインポートステートメント)に影響を与えないため、問題ないと思います。ただし、クライアント側への唯一の答えはあなたです。これは受け入れられるべきです。
のRik

1

ここですでに回答したように、path.join手動でパスを作成するためのOS固有のパス区切り文字を見つけることができます。しかし、あなたpath.joinは仕事をさせることもできます。これは、パスの構築を扱うときに私の好ましい解決策です。

例:

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

-3

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


4
OPはdetermine、どこでも機能する演算子ではなく、方法を尋ねました:-)
Steel Brain

3
何かを抽出するためにパスを解析する必要があるため、これは機能します。
Chris Seufert 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.