我在 Windows 上开发,但需要知道如何将 Windows 路径(带反斜杠
\
)转换为带正斜杠的 POSIX 路径(/
)?
我的目标是将
C:\repos\vue-t\tests\views\index\home.vue
转换为C:/repos/vue-t/tests/views/index/home.vue
所以我可以在我正在写入磁盘的文件的导入中使用它
const appImport = `
import Vue from "vue"
import App from '${path}'
function createApp (data) {
const app = new Vue({
data,
render: h => h(App)
})
return app
}`
//this string is then written to the disk as a file
我宁愿不要
.replace(/\\/g, '/')
字符串,而宁愿使用require('path')
函数。
鉴于所有其他答案都依赖于安装(太大或太小)第三方模块:这也可以作为相对路径的单行来完成(你应该已经在 99.999% 的时间里使用它) 使用 Node 的标准库
path
模块,更具体地说,利用其专用的 path.posix
和 path.win32
命名空间属性/函数(在 Node v0.11 中引入):
const path = require("path");
// ...
const definitelyPosix = somePathString.split(path.sep).join(path.posix.sep);
const definitelyWindows = somePathString.split(path.sep).join(path.win32.sep);
这会将您的路径转换为 POSIX(或 Windows)格式,无论您是否已经在 POSIX(或 Windows)兼容平台上,而无需任何类型的外部依赖。
Slash 将 windows 反斜杠路径转换为 Unix 路径
用法:
const path = require('path');
const slash = require('slash');
const str = path.join('foo', 'bar');
slash(str);
// Unix => foo/bar
// Windows => foo/bar
有一个名为 upath 的节点包将 windows 路径转换为 unix。
upath = require('upath');
或
import * as upath from 'upath';
upath.toUnix(destination_path)
对于那些寻找不依赖于 Node.js 的答案的人
//
// one-liner
//
let convertPath = (windowsPath) => windowsPath.replace(/^\\\\\?\\/,"").replace(/\\/g,'\/').replace(/\/\/+/g,'\/')
//
// usage
//
convertPath("C:\\repos\\vue-t\\tests\\views\\index\\home.vue")
// >>> "C:/repos/vue-t/tests/views/index/home.vue"
//
// multi-liner (commented and compatible with really old javascript versions)
//
function convertPath(windowsPath) {
// handle the edge-case of Window's long file names
// See: https://learn.microsoft.com/en-us/windows/win32/fileio/naming-a-file#short-vs-long-names
windowsPath = windowsPath.replace(/^\\\\\?\\/,"");
// convert the separators, valid since both \ and / can't be in a windows filename
windowsPath = windowsPath.replace(/\\/g,'\/');
// compress any // or /// to be just /, which is a safe oper under POSIX
// and prevents accidental errors caused by manually doing path1+path2
windowsPath = windowsPath.replace(/\/\/+/g,'\/');
return windowsPath;
};
// dont want the C: to be inluded? here's a one-liner for that too
let convertPath = (windowsPath) => windowsPath.replace(/^\\\\\?\\/,"").replace(/(?:^C:)?\\/g,'\/').replace(/\/\/+/g,'\/')
通常我导入库。但是,我去阅读了
slash
和upath
的源代码。这些功能不是特别最新,而且在我检查时非常小。事实上,这个 liner 实际上比 slash 库处理更多的情况。不是每个人都在寻找这种解决方案,但对于那些正在寻找的人来说,就是这样。巧合的是,这是所有当前答案中运行时间最快的。
只需使用默认库作为:
const {direname, resolve, basename}= require('path').posix;
或
import {posix} from 'path';
const {direname, resolve, basename}= posix;
我一直在寻找类似的东西,但更通用一些,尤其是在绝对路径中包含驱动器。因此,如果您使用例如git-bash 或 WSL 通常将驱动器默认映射为来自 root / (git-bash) 或 /mnt (WSL) 的字母。所以这是一个为我完成工作的正则表达式
// For git-bash Windows drives are mounted in the root like /C/ /D/ etc.
const toGitBashPosixPath = (windowsPath) => windowsPath.replace(/^(\w):|\\+/g,'/$1');
console.log(toGitBashPosixPath('c:\\\\\\project\\file.x')); // messy Windows path
console.log(toGitBashPosixPath('c:\\project\\file.x')); // regular Windows path
console.log(toGitBashPosixPath('c:/project/file.x')); // slash path acceptable by Windows
console.log(toGitBashPosixPath('project\\file.x'));// relative Windows path
console.log(toGitBashPosixPath('.\\project\\file.x'));// another relative Windows path
// For WSL Windows drives are mounted by default next to /mnt like /mnt/C/ /mnt/D/ etc.
const toWSLPosixPath = (windowsPath) => windowsPath.replace(/^(\w):|\\+/g,'/$1').replace(/^\//g,'/mnt/');
console.log(toWSLPosixPath('c:\\project\\file.x'))
希望这会对某人有所帮助。
const winPath = 'C:\\repos\\vue-t\\tests\\views\\index\\home.vue'
const posixPath = winPath.replace(/\\/g, '/').slice(2)
// Now posixPath = '/repos/vue-t/tests/views/index/home.vue'