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

Posted

技术标签:

【中文标题】如何确定 JavaScript 中的操作系统路径分隔符?【英文标题】:How to determine the OS path separator in JavaScript? 【发布时间】:2010-09-12 15:40:54 【问题描述】:

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

【问题讨论】:

当 Javascript 在浏览器中运行且操作系统完全隔离时,为什么需要这个?您无法从本地计算机访问文件... JavaScript 通常但不总是在浏览器中运行。 JavaScript 在浏览器之外使用的一些示例包括 Mozilla XULRunner 应用程序、使用 V8 或 WSH 等命令行解释器运行的 js 脚本以及用 JScript 编写的 ASP 页面。 JS有很多用途。 我确定你已经解决了这个问题,但是我在下面为你的问题和答案添加了一个用例,因为和你一样,我知道总有一种情况你可以' t 依赖操作系统为您解析分隔符! :)。干杯! 这个问题非常相关,因为 JavaScript 经常在 Node.js 中运行。在那里您可以并且想要访问文件系统,因此路径分隔符很重要。如果您想创建多操作系统 Node.js 应用程序,这也是痛点之一。 Node.js 是多平台的,但这并不意味着任何 Node.js 程序都可以在所有受支持的操作系统上运行,而无需特别注意所使用的文件路径。 【参考方案1】:

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

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

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

const path = require('path')

【讨论】:

你可以改进你的答案specifying how: path.sep const path = require('path'); 虽然我知道我可以在大多数情况下使用“/”,如果不是全部的话。当我将输出打印到控制台以进行反馈或记录时。我喜欢在完整路径中使用相同的斜线。 我认为上面是正确的答案,也是最简单的解决方案。正如 Sebas 所指出的,要访问路径模块,您必须执行 path = require('path')。如果您是 Node.programmer,即使是新手,您可能已经知道这一点。【参考方案2】:

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

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

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

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

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

【讨论】:

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

正确答案

所有操作系统都接受 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 被设置为索引00 之间的子字符串(indexOf('/')C:\Program Files\Notepad\Notepad++.exe 中是-1),导致空字符串。

解决方案...

这包括来自以下帖子的代码:How do I determine the current operating system with 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

这就是所有人!

【讨论】:

我喜欢您提出的查找要使用的分隔符的逻辑,并将其分成可管理的块。这就是专业人士作为工程师的工作方式。 +1 为此。此外,考虑到问题的年龄和缺少NodeJS 标签 - 您已经回答了 serverclient 方面的问题。您的回答完全 - 并且实际上 - 回答了这个问题。对于节点,我认为路径模块很好,因为它不会影响生成的字节码性能,也不应该影响可读性(单个导入语句)。但是,您是客户端的唯一答案。这应该是被接受的。【参考方案4】:

正如这里已经回答的那样,您可以使用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

【讨论】:

【参考方案5】:

只需使用“/”,据我所知,它适用于所有操作系统。

【讨论】:

OP 询问如何determine,而不是在任何地方都可以使用的运算符 :-) 它的工作原理是你必须解析一个路径来提取一些东西。

以上是关于如何确定 JavaScript 中的操作系统路径分隔符?的主要内容,如果未能解决你的问题,请参考以下文章

如何修改此 Select2 javascript 以启用分页?

如何确定Javascript中项目网格中的选择范围之间的重叠

导入 JavaScript 时如何在 QML 中使用绝对路径?

javascript中的对象语法[重复]

产品分析:用户行为路径及确定性

如何从确定的路径中删除 usr/local/include 中的所有符号链接