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

问题描述 投票:0回答:6

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

javascript file directory
6个回答
231
投票

使用 path

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

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

编辑:根据下面 Sebas 的评论,要使用它,您需要将其添加到 js 文件的顶部:

const path = require('path')

27
投票

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

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

所以,情况可以总结一下 相当简单:

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

  • 标准命令 shell(CMD 或 COMMAND)都不会接受转发 斜线。甚至“cd ./tmp”示例 上一篇文章中给出的失败。


17
投票

正确答案

所有操作系统都接受 CD ../ 或 CD ..\ 或 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);
    }
}

发生了什么!?

targetDir
被设置为索引
0
0
之间的子字符串(
indexOf('/')
-1
中的
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...

获取父目录的帮助函数(跨平台)

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

这就是大家!


11
投票

正如此处已经回答的那样,您可以使用

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

0
投票

在 javascript 中,您可以从

window.navigator.userAgent

获取此信息

0
投票

我不经常使用 JS,但有一个解决方案可以展示,仅适用于 JS,不是 Node.js,而是使用 PHP。 算法是这样运行的:

  1. 创建一个带有条目的 php 文件

    回显DIRECTORY_SEPARATOR;

  2. 您需要 AJAX 来调用该 php 脚本,如下所示(在这种情况下是同步):

    const req_ = new XMLHttpRequest(); req_.open("GET", "directory_separator.php"), false); req_.send(null); if(req_.status == 200) { 返回req_.responseText; } 返回空值;

  3. 不要忘记将其保存在变量中。

© www.soinside.com 2019 - 2024. All rights reserved.