Nodejs在Windows中使用正斜杠的绝对路径

41

我能在Node.js中使用正斜杠的绝对路径在Windows系统上吗?我正在使用类似于以下的代码:

global.__base = __dirname + '/';
var Article = require(__base + 'app/models/article');

但是在Windows上构建失败,因为它需要类似于C:\Something\Something/apps/models/article这样的东西。 我正在使用webpack。 那么如何规避此问题,使要求保持不变,即__base + 'app/models/src'


https://nodejs.org/api/path.html - Amadan
@Amadan,就像我说的那样,我不想改变我需要模块的方式。 - Megh Parikh
1
如果你不想更改你的代码,那么你希望我们怎么做? - Amadan
我在谈论绕过global.__base = __dirname + '/';的另一种方法。我愿意进行更改,因为它只在代码中发生一次。 - Megh Parikh
你仍然将 / 作为 app/models/article 中的分隔符修复。我不知道 C:\Something\Something / apps / models / article 在Windows上是否可行(我从未为其开发过),但是 path.join(__dirname,'app','models','article') 是可行的。 - Amadan
9个回答

53

虽然回答有点晚,但我认为我的回答会对某些访问者有所帮助。

Node.js 中,你可以通过使用变量 __filename__dirname 来轻松获取当前运行文件的名称和目录。

为了根据你的系统正确更正正斜杠和反斜杠,你可以使用 Node.jspath 模块。

var path = require('path');

这里有一个混乱的路径,如果我想在服务器上使用它,我希望它是正确的。在这种情况下,path模块可以为您完成所有操作。

var randomPath = "desktop//my folder/\myfile.txt";

var correctedPath = path.normalize(randomPath); //that's that

console.log(correctedPath);
desktop/my folder/myfile.txt
如果您想获取文件的绝对路径,您还可以使用 path 模块的 resolve 函数。
var somePath = "./img.jpg";
var resolvedPath = path.resolve(somePath);

console.log(resolvedPath);
/Users/vikasbansal/Desktop/temp/img.jpg

3
@VikasBansat:path.normalize(path.resolve('./')) - 这实际上是您建议的方法。然而,在Windows 8下,这并不能解决问题(至少是这样)。 - Valentine Shi
50
完全不起作用。反斜杠仍然是反斜杠。 - Andrew Koster
2
这仅适用于UNIX系统。对于Windows,默认路径分隔符是反斜杠。 - Noname
2
经过测试,这在Windows上不起作用。使用这个方法,斜杠仍然是反向的。这个答案不应该被接受,因为它不能解决提问者在Windows系统中遇到的问题。 - Vladimir Jovanović

28

已经到了2020年,距离提问发布已经过去5年了,但我希望我的回答对某些人有用。我使用了替换方法,在这里是我的代码(express js 项目):

const viewPath = (path.join(__dirname, '../views/')).replace(/\\/g, '/')

exports.articlesList = function(req, res) {
    res.sendFile(viewPath + 'articlesList.html');
} 

1
对我来说,将正斜杠路径插入数据库非常有效。 - volume one

3
我最终是这样做的:
var slash = require('slash');
var dirname = __dirname;
if (process.platform === 'win32') dirname = slash(dirname);

global.__base = dirname + '/';

然后需要使用 var Article = require(__base + 'app/models/article');。这里使用的是 npm 包 slash(它可以在路径中将反斜杠替换为正斜杠并处理更多情况)。


6
我更建议使用 https://nodejs.org/api/path.html#path_path_sep,这正是此功能的目的 ;) 并将其变成一行代码! - Vadorequest
1
@Vadorequest 谢谢您!我以前从未听说过 path.sep - 这正是我正在寻找的! - Jens Væver Hartfelt
感谢您提醒我这个解决方案的存在,我完全忘记了它^^'。 - Vadorequest

3
接受的答案实际上并没有回答大多数人来到这里寻找的问题。如果您想规范所有路径分隔符(可能是为了字符串处理),这就是您需要的内容。
所有代码段都导入了node.js内置模块“path”到变量“path”中。除非另有说明,否则它们还将要处理的变量存储在不可变变量“str”中。
如果您有一个字符串,这里有一个快速的一行代码将该字符串规范化为正斜杠(/):
const answer = path.resolve(str).split(path.sep).join("/");

您可以通过替换斜杠(/)来将任何其他分隔符进行规范化。
如果您只想要路径的各个部分的数组,请使用以下代码:
const answer = path.resolve(str).split(path.sep);

完成字符串操作后,使用以下内容创建可用的路径:

const answer = path.resolve(str);

从一个数组中,使用以下方法:

// assume the array is stored in constant variable arr
const answer = path.join(...arr);

1

这是我使用的方法,可以节省一些处理时间:

const path = require('path');

// normalize based on the OS
const normalizePath = (value: string): string {
  return path.sep === '\' 
    ? value.replace(/\\/g, '/')
    : value;
}

console.log('abc/def'); // leaves as is
console.log('abc\def'); // on windows converts to `abc/def`, otherwise leave as is

0
我建议不要这样做,因为它会修改节点本身,但是...好吧,你需要的东西没有任何变化。
(function() {
  "use strict";
  var path = require('path');
  var oldRequire = require;
  require = function(module) {
    var fixedModule = path.join.apply(path, module.split(/\/|\\/));
    oldRequire(fixedModule);
  }
})();

0

Windows使用\,Linux和Mac使用/作为路径前缀。

对于Windows: 'C:\\Results\\user1\\file_23_15_30.xlsx'

对于Mac/Linux: /Users/user1/file_23_15_30.xlsx

如果文件中有\ - 它是Windows系统,使用文件分隔符\,否则使用/

let path=__dirname; // or filePath
fileSeparator=path.includes('\')?"\":"/"  
newFilePath = __dirname + fileSeparator + "fileName.csv";

0
已经太晚了,但实际答案是根据需求使用path.seppath.join

在Windows中,目录路径为"",而在Linux中为"/",因此路径库会自动处理这个问题。

const path = require("path");
const abPath = path.join(__base ,'app','models','article')

或者

const path = require("path");
const abPath = __base + 'app'+ path.sep +'models'+ path.sep +'article';

-1
使用路径模块。
const path = require("path");
var str = "test\test1 (1).txt";
console.log(str.split(path.sep)) // This is only on Windows

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接