【问题标题】:Find relative path of file from another file with path string使用路径字符串从另一个文件中查找文件的相对路径
【发布时间】:2019-10-15 13:04:29
【问题描述】:

我正在尝试找出一种方法来比较两个绝对(ish!)文件位置,并以尽可能最短的方式返回从一个到另一个的相对路径。

/*
Example 1:
..\root\folder\subFolder\myCurrent.file
..\root\folder\subFolder\img\myTarget.image

Expected result:
.\img\myTarget.image

Example 2:
..\root\folder\subFolder\myCurrent.file
..\root\folder\otherSubFolder\img\myTarget.image

Expected result:
..\otherSubFolder\img\myTarget.image

Example 3:
..\root\folder\subFolder\myCurrent.file
..\root\folder\subFolder\myTarget.image

Expected result:
myTarget.image
*/

我尝试将路径拆分为数组并比较长度和值,但结果完全是一团糟,我什至还没有做到...

const currentFilePath = activepath.split('\\')
const currentDir = currentFilePath[currentFilePath.indexOf(currentFilePath[currentFilePath.length - 2])];
const targetFilePath = file.path.split('\\');
const targetDir = targetFilePath[targetFilePath.indexOf(targetFilePath[targetFilePath.length - 2])];
const currentFileDepth = currentFilePath.length;
// and so on...

我想要一个体面、干净的方法来解决这个问题...

【问题讨论】:

    标签: javascript path


    【解决方案1】:

    您可以拆分两个路径,然后使用 .filter() 从两个数组中获取唯一组件。然后再次使用.filter() 并最后使用.join('\\') 来获取与第二条路径部分相关的独特组件来创建您的结果:

    const comparePaths = (a, b) => {
      const a_parts = a.split('\\');
      const b_parts = b.split('\\');
      const arr = [...a_parts, ...b_parts];
      const diffs = arr.filter(item => arr.indexOf(item) === arr.lastIndexOf(item));
      let path_parts = diffs.filter(part => b_parts.includes(part));
      const res = ".".repeat(path_parts.length && path_parts.length-1 || 0) +'\\'+ path_parts.join('\\');
      return res;
    }
    
    console.log(comparePaths("..\\root\\folder\\subFolder\\myCurrent.file",
    "..\\root\\folder\\subFolder\\img\\myTarget.image"));
    
    console.log(comparePaths("..\\root\\folder\\subFolder\\myCurrent.file",
    "..\\root\\folder\\otherSubFolder\\img\\myTarget.image"));
    
    console.log(comparePaths("..\\foo\\bar\\foobar.js",
    "..\\foo\\bar\\foobar.js"));

    【讨论】:

    • 抱歉,关于我想要实现的目标,第一和第三个日志是错误的。它们应该分别以'.\'和''而不是'..\'开头。这两条路径无法正确解析。
    • 所以您对两者的预期输出应该以.\ 开头?因为那不是问题中写的内容
    • 预期输出应该是将当前文件链接到目标文件的有效文件系统路径。我提供了另一个示例,以便您发现差异。
    【解决方案2】:

    对于 node.js,这里有一个 built-in

    let path = require('path').win32;
    
    r = path.relative(
        "..\\root\\folder\\subFolder\\myCurrent.file",
        "..\\root\\folder\\subFolder\\img\\myTarget.image");
    
    console.log(r) // ..\img\myTarget.image
    

    对于浏览器,谷歌四处寻找端口,或者只是抓住the source,它小巧透明。

    path.relative希望第一个参数是目录,如果是文件名,则必须先获取目录:

    let path = require('path').win32;
    
    r = path.relative(
        path.dirname("..\\root\\folder\\subFolder\\myCurrent.file"),
        "..\\root\\folder\\subFolder\\img\\myTarget.image");
    
    console.log(r) // img\myTarget.image
    

    【讨论】:

    • 刚刚尝试过,它值得我给你的赞成票。但是,如您的 sn-p 中所述,该函数返回一个以“..\”开头的字符串,但想象一下,如果这是我将作为 的 src 插入的图像的路径......它会坏了。为什么它与预期的“.\”不同?
    • 为什么文档很少详细说明这一点?还是谢谢!
    猜你喜欢
    • 1970-01-01
    • 2016-09-19
    • 1970-01-01
    • 1970-01-01
    • 2022-12-08
    • 2016-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多