スクリプトが実行されているOSで使用されているパス区切り文字をJavaScriptで確認するにはどうすればよいですか?
スクリプトが実行されているOSで使用されているパス区切り文字をJavaScriptで確認するにはどうすればよいですか?
回答:
Windowsでも、パス区切り文字として/をいつでも使用できます。
http://bytes.com/forum/thread23123.htmlからの引用:
したがって、状況はかなり簡単に要約できます。
DOS2.0以降のすべてのDOSサービスおよびすべてのWindowsAPIは、スラッシュまたはバックスラッシュのいずれかを受け入れます。いつももっている。
標準のコマンドシェル(CMDまたはCOMMAND)は、スラッシュを受け入れません。前の投稿で示した「cd./tmp」の例でさえ失敗します。
でpath
モジュールを使用するとnode.js
、プラットフォーム固有のファイル区切り文字が返されます。
例
path.sep // on *nix evaluates to a string equal to "/"
編集:以下のSebasのコメントによると、これを使用するには、jsファイルの先頭にこれを追加する必要があります。
const path = require('path')
path.sep
、回答を改善できます。
const path = require('path');
はい、すべての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
インデックス間のサブストリングに設定され0
、そして0
(indexOf('/')
ある-1
にC:\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
NodeJS
タグの欠如を考慮して、サーバー側とクライアント側の両方について回答しました。あなたの答えは完全に-そして実際に-質問に答えます。ノードの場合、パスモジュールは、生成されたバイトコードのパフォーマンスに影響を与えず、可読性(単一のインポートステートメント)に影響を与えないため、問題ないと思います。ただし、クライアント側への唯一の答えはあなたです。これは受け入れられるべきです。
ここですでに回答したように、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
「/」を使用するだけで、私が知る限り、すべてのOSで動作します。
determine
、どこでも機能する演算子ではなく、方法を尋ねました:-)