如何确定 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
被设置为索引0
和0
之间的子字符串(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
标签 - 您已经回答了 server 和 client 方面的问题。您的回答完全 - 并且实际上 - 回答了这个问题。对于节点,我认为路径模块很好,因为它不会影响生成的字节码性能,也不应该影响可读性(单个导入语句)。但是,您是客户端的唯一答案。这应该是被接受的。【参考方案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中项目网格中的选择范围之间的重叠