如何确定JavaScript中的OS路径分隔符?

61 javascript directory file

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

小智 119

使用pathmodule node.js返回特定于平台的文件分隔符.

path.sep  // on *nix evaluates to a string equal to "/"
Run Code Online (Sandbox Code Playgroud)

编辑:根据Sebas的评论,要使用此功能,您需要在js文件的顶部添加:

const path = require('path')
Run Code Online (Sandbox Code Playgroud)

  • `const path = require('path');` (10认同)
  • 您可以改进答案[指定如何:`path.sep`](https://nodejs.org/docs/latest/api/path.html#path_path_sep). (2认同)

VVS*_*VVS 18

你可以随时使用/作为路径分隔符,即使在Windows上也是如此.

引自http://bytes.com/forum/thread23123.html:

因此,情况可以简单地概括为:

  • 自DOS 2.0以来所有DOS服务和所有Windows API都接受正斜杠或反斜杠.一直有.

  • 标准命令shell(CMD或COMMAND)都不会接受正斜杠.即使前一篇文章中给出的"cd ./tmp"示例也失败了.

  • 我忽略了这个答案,因为它忽略了问题的完美有效性 - 即有些情况下你确实需要知道所使用的路径分隔符.例如,需要将路径拆分成碎片将使用分隔符. (3认同)
  • 这不是对所提出问题的完全正确答案。请参阅下面的“正确答案” :)。 (2认同)
  • @VVS - 在您使用两种类型的斜杠(至少在 Windows 7 上)的情况下不起作用。考虑使用 __dirname 构造变量然后需要附加路径的其余部分的情况。例如:__dirname + '/images'。在该示例中 __dirname 将使用操作系统特定的斜杠,但如果您尝试使用 /images 并且您在 Windows 上,您最终会得到像 c:\somepath/images 这样的路径,并且在 Windows 上不起作用。我刚遇到这种情况,这就是我提到它的原因:)。 (2认同)
  • VVS 的答案是正确的,除了解析 Internet Explorer 中输入的文件给出的路径(使用 IE8 测试 - 我不知道其他版本)。在这种情况下,由输入元素的值(input.value)给出的路径的形式为“C:\fakepath\<filename>”。注意这里的反斜杠。 (2认同)

Ben*_*uer 10

正如此处已经回答的那样,您可以找到操作系统特定的路径分隔符来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
Run Code Online (Sandbox Code Playgroud)


Dec*_*ded 8

正确答案

的,无论您如何传递分隔符,所有操作系统都接受CD ../或CD .. \或CD..。但是读回一条路呢?您怎么知道它说的是“ windows”路径,带有' '\允许。

显而易见的“ Du!” 题

例如,当您依赖安装目录时,会发生什么情况%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);
    }
}
Run Code Online (Sandbox Code Playgroud)

发生了什么!?

targetDir是被设定为所述指标之间的子串0,和0indexOf('/')-1C:\Program Files\Notepad\Notepad++.exe),导致空字符串。

解决方案...

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

myGlobals = { isWin: false, isOsX:false, isNix:false };
Run Code Online (Sandbox Code Playgroud)

服务器端检测操作系统。

// 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; }
Run Code Online (Sandbox Code Playgroud)

浏览器侧检测操作系统

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;
Run Code Online (Sandbox Code Playgroud)

辅助函数获取分隔符

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

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

// modifying our getDir method from above...
Run Code Online (Sandbox Code Playgroud)

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)

如果要加载模块以完成此简单任务,也可以如上所述使用“ path”模块和path.sep。就个人而言,我认为仅从您已经可用的过程中检查信息就足够了。

var path = require('path');
var fileSep = path.sep;    // returns '\\' on windows, '/' on *nix
Run Code Online (Sandbox Code Playgroud)

多数民众赞成!

  • 我喜欢你提出的逻辑来查找要使用的分隔符,将其分成可管理的块。这就是专业人士作为工程师的工作方式。**+1** 为此。另外,考虑到问题的年龄和缺乏“NodeJS”标签 - 您已经回答了*服务器*和*客户端*端。您的回答确实完全 - 并且*实际上* - 回答了问题。对于节点,我认为路径模块很好,因为它不会影响生成的字节码性能,也不应该影响可读性(单个导入语句)。然而,你是客户端的唯一答案。这应该是公认的。 (2认同)