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


82

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


在完全隔离操作系统的浏览器中运行Javascript时,为什么需要此功能?您无法从本地计算机访问文件...
lms

JavaScript通常但并非总是在浏览器中运行。浏览器之外的JavaScript使用示例包括Mozilla XULRunner应用程序,使用诸如V8或WSH之类的命令行解释器运行的js脚本以及用JScript编写的ASP页面。JS有很多用途。
Joel Anair

我确定您已经解决了该问题,但是我在下面为您的问题和答案添加了一个用例,因为像您一样,我知道总有一种情况,您不能依靠操作系统来解决问题。分隔符为您服务!:)。干杯!
解码

2
这个问题非常相关,因为JavaScript通常在Node.js中运行。您可以在那里并且想要访问文件系统,因此路径分隔符很重要。如果要创建多操作系统Node.js应用程序,这也是痛苦点之一。Node.js是多平台的,但这并不意味着任何Node.js程序都可以在所有受支持的OS上运行,而无需特别注意所使用的文件路径。
Panu Logic

Answers:


20

实际上,即使在Windows上,您也可以始终将/用作路径分隔符。

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

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

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

  • 标准命令外壳程序(CMD或COMMAND)都不会接受正斜杠。甚至上一篇文章中给出的“ cd ./tmp”示例都失败了。


1
VVS的答案是正确的,除了解析Internet Explorer中文件输入给出的路径(已通过IE8测试-我不知道其他版本)。在这种情况下,输入元素的值(input.value)给出的路径的格式为“ C:\ fakepath \< filename>”。注意这里的反斜杠。
米拉格里

JFYI内容:cmd.exe手柄“CD /窗口”(作为一个例子)正确地在Windows XP和Windows 7
尤金Mayevski“回拨

2
这不是对所提出问题的完全正确答案。请参阅下面的“正确答案” :)。
2016年

5
我否决了这个答案,因为它忽略了问题的完美有效性,也就是说,在某些情况下,您实际上需要知道所使用的路径分隔符。例如,需要将路径拆分为多个部分,可以使用分隔符。
MirroredFate

2
@VVS-在同时使用两种类型的斜杠(至少在Windows 7上)的情况下不起作用。考虑以下情况:正在使用__dirname构造变量,然后需要附加路径的其余部分。例如:__dirname +'/ images'。在该示例中,__dirname将使用特定于操作系统的斜杠,但是如果您尝试使用/ images并且在Windows上,则最终将得到c:\ somepath / images这样的路径,而在Windows上将无法使用。我只是遇到了这种情况,这就是为什么我提到它:)。
dcp

160

Use pathmodule innode.js返回平台特定的文件分隔符。

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

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

const path = require('path')

2
您可以指定以下方式path.sep来改善答案
尼卡比曹

11
const path = require('path');
塞巴(Sebas)

虽然我知道我可以在大多数情况下使用'/'。当我将输出打印到控制台以进行反馈或记录时。我喜欢在完整路径中使用相同的斜杠。
b01

我认为以上是正确的答案,也是最简单的解决方案。正如Sebas指出的那样,要访问路径模块,您必须执行path = require('path')。如果您是Node.programmer,甚至是新手,您都可能已经知道。
Panu Logic

7

正确答案

的,无论您如何传递分隔符,所有操作系统都接受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);
    }
}

发生了什么!?

targetDir被设置为索引0和之间的子字符串,0indexOf('/')-1in C:\Program Files\Notepad\Notepad++.exe),导致空字符串。

解决方案...

这包括以下文章中的代码:如何使用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

多数民众赞成!


1
我喜欢您介绍了用于查找要使用的分隔符并将其分成可管理的块的逻辑。这就是专业人员作为工程师的工作方式。+1。此外,考虑到问题的年代和缺少NodeJS标签的问题,您已经回答了服务器客户端的问题。您的答案完全可以-实际上-可以回答问题。对于节点,我认为path模块很好,因为它不会影响生成的字节码性能,也不会影响可读性(单个import语句)。但是,您是客户端的唯一答案。这应该被接受。
瑞克

1

如此处已回答的那样,您可以找到用于特定操作系统的路径分隔符,path.join以手动构建路径。但是您也可以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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.