如何在 JavaScript 中确定操作系统路径分隔符?

如何在 JavaScript 中告诉在运行脚本的操作系统中使用了什么路径分隔符?

75914 次浏览

只要使用“/”,据我所知,它可以在所有的操作系统上工作。

Afair 可以始终使用/作为路径分隔符,即使在 Windows 上也是如此。

Quote from http://bytes.com/forum/thread23123.html:

所以,情况可以这样总结 相当简单:

  • 自 DOS 2.0以来的所有 DOS 服务和所有 Windows API 都接受转发 斜线或反斜线。总是有。

  • 没有任何标准命令 shell (CMD 或 COMMAND)将接受转发 即使是“ cd./tmp”示例 在前一篇文章中给出的答案不合格

node.js中使用 path模块返回特定于平台的文件分隔符。
例子

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

编辑: 根据 Sebas 在下面的评论,要使用这个,你需要在 js 文件的顶部添加这个:

const path = require('path')

正确答案

所有操作系统接受光盘。.或光碟。.或 CD。.无论如何传递分隔符。但是读一条回去的路怎么样。你怎么知道,如果它说,一个’窗口’路径,与 ' '\允许。

显而易见的“废话”问题

例如,当您依赖于安装目录 %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);
}
}

What happened!?

targetDir被设置为指数 00之间的一个子字符串(indexOf('/')C:\Program Files\Notepad\Notepad++.exe中是 -1) ,从而产生空字符串。

解决方案。

这包括来自以下文章的代码: 如何使用 Node.js 确定当前的操作系统

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

操作系统的服务器端检测。

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

操作系统的浏览器端检测

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...

Helper 函数获取父目录(跨平台)

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

And Thats All Folks!

正如在这里已经回答的,您可以找到与 path.sep操作系统特定的路径分隔符来手动构造您的路径。但是您也可以让 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