[英]How to determine the OS path separator in JavaScript?
如何在 JavaScript 中判断在运行脚本的操作系统中使用了什么路径分隔符?
在node.js
使用path
模块返回特定于平台的文件分隔符。
例子
path.sep // on *nix evaluates to a string equal to "/"
编辑:根据下面 Sebas 的评论,要使用它,您需要在 js 文件的顶部添加它:
const path = require('path')
Afair 您始终可以使用 / 作为路径分隔符,即使在 Windows 上也是如此。
引自http://bytes.com/forum/thread23123.html :
所以,情况可以很简单地总结:
自 DOS 2.0 以来的所有 DOS 服务和所有 Windows API 都接受正斜杠或反斜杠。 一直有。
标准命令外壳程序(CMD 或 COMMAND)都不会接受正斜杠。 甚至上一篇文章中给出的“cd ./tmp”示例也失败了。
是的,无论您如何传入分隔符,所有操作系统都接受 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
),导致空字符串。
这包括来自以下帖子的代码: 如何使用 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
VVS的答案是正确的,除了解析由Internet Explorer中的文件输入给出的路径(用IE8测试 - 我不知道其他版本)。 在这种情况下,输入元素的值(input.value)给出的路径采用“C:\\ fakepath \\ <filename>”的形式。 请注意这里的反斜杠。
正如这里已经回答的那样,您可以使用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
只需使用“/”,据我所知,它适用于所有操作系统。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.