如何在JavaScript中告诉运行脚本的OS使用了什么路径分隔符?
如何在JavaScript中告诉运行脚本的OS使用了什么路径分隔符?
Answers:
实际上,即使在Windows上,您也可以始终将/用作路径分隔符。
引用http://bytes.com/forum/thread23123.html:
因此,可以将情况简单地概括为:
自DOS 2.0以来的所有DOS服务和所有Windows API都接受正斜杠或反斜杠。一直有。
标准命令外壳程序(CMD或COMMAND)都不会接受正斜杠。甚至上一篇文章中给出的“ cd ./tmp”示例都失败了。
Use path
module innode.js
返回平台特定的文件分隔符。
例
path.sep // on *nix evaluates to a string equal to "/"
编辑:根据下面的Sebas的评论,要使用此功能,您需要在js文件顶部添加此功能:
const path = require('path')
path.sep
来改善答案:。
const path = require('path');
是的,无论您如何传递分隔符,所有操作系统都接受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('/')
是-1
in 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
NodeJS
标签的问题,您已经回答了服务器端和客户端的问题。您的答案完全可以-实际上-可以回答问题。对于节点,我认为path模块很好,因为它不会影响生成的字节码性能,也不会影响可读性(单个import语句)。但是,您是客户端的唯一答案。这应该被接受。
如此处已回答的那样,您可以找到用于特定操作系统的路径分隔符,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
据我所知,只需使用“ /”,它就可以在所有操作系统上运行。
determine
,而不是到处都可以使用的运算符是什么:-)