Найти относительный путь к файлу из другого файла со строкой пути - PullRequest
0 голосов
/ 15 октября 2019

Я пытаюсь найти способ сравнить два абсолютных (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...

Я бы хотел достойный, чистый способчтобы понять это ...

Ответы [ 2 ]

1 голос
/ 15 октября 2019

Для node.js есть встроенная для этого:

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

Для браузеров, найдите в Google порт или просто захватите источник , который является маленьким и прозрачным.

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
1 голос
/ 15 октября 2019

Вы можете разделить оба пути, а затем получить уникальные компоненты из обоих массивов, используя .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"));
...