【问题标题】:How to determine the OS path separator in JavaScript?如何确定 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 程序都可以在所有受支持的操作系统上运行,而无需特别注意所使用的文件路径。

标签: javascript file directory


【解决方案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,而不是在任何地方都可以使用的运算符 :-)
    • 它的工作原理是你必须解析一个路径来提取一些东西。
    猜你喜欢
    • 1970-01-01
    • 2011-06-10
    • 1970-01-01
    • 1970-01-01
    • 2015-12-10
    • 1970-01-01
    • 2010-12-21
    • 2010-09-22
    • 1970-01-01
    相关资源
    最近更新 更多