получить относительный путь от абсолютного пути к другому файлу с помощью Haskell - PullRequest
0 голосов
/ 29 мая 2020

Я ищу функцию Haskell, чтобы указать относительный путь между двумя абсолютными путями. Например, давая:

  1. / home / mydir / images / dir1

  2. / home / mydir / docs / dir2

Мне нужен относительный путь от 1 до 2: .. / .. / docs / dir2

Я взглянул на filepath и каталог , но я не нашел то, что мне нужно.

Есть ли функция или библиотека, чтобы делать то, что я хочу?

1 Ответ

0 голосов
/ 29 мая 2020

Такую функцию не нашел. Вы можете построить его с помощью filepath утилит

import System.FilePath
import Control.Applicative

relativeTo :: FilePath -> FilePath -> FilePath
relativeTo path1 path2 = joinPath . getZipList $ ZipList commonPath <|> ZipList splitPath1
 where
  splitPath1 = splitDirectories . dropDrive $ path1
  splitPath2 = splitDirectories . dropDrive $ path2
  dirToDots x y = if x == y && (x /= "/")
                    then ".." 
                    else ""
  commonPath = takeWhile (/= "") $ zipWith dirToDots splitPath1 splitPath2

main = print $ "/home/mydir/docs/dir2" `relativeTo` "/home/mydir/images/dir1"

Поведение с путями, содержащими точки (например, some/./path или some/../path), не проверяется

...