如何使用节点路径将 Windows 路径转换为 posix 路径

问题描述 投票:0回答:7

我在 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')
函数。

javascript node.js windows posix
7个回答
91
投票

鉴于所有其他答案都依赖于安装(太大或太小)第三方模块:这也可以作为相对路径的单行来完成(你应该已经在 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)兼容平台上,而无需任何类型的外部依赖。


8
投票

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

4
投票

有一个名为 upath 的节点包将 windows 路径转换为 unix。

upath = require('upath');

import * as upath from 'upath';

upath.toUnix(destination_path)

2
投票

对于那些寻找不依赖于 Node.js 的答案的人

One Liner(无第 3 方库)

//
// 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 库处理更多的情况。不是每个人都在寻找这种解决方案,但对于那些正在寻找的人来说,就是这样。巧合的是,这是所有当前答案中运行时间最快的。


0
投票

只需使用默认库作为:

const {direname, resolve, basename}= require('path').posix;

import {posix} from 'path';
const {direname, resolve, basename}= posix;

0
投票

我一直在寻找类似的东西,但更通用一些,尤其是在绝对路径中包含驱动器。因此,如果您使用例如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'))

希望这会对某人有所帮助。


-2
投票
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'
© www.soinside.com 2019 - 2024. All rights reserved.