Haskell затеняет операции с файлами (упрощает точки) - PullRequest
11 голосов
/ 15 декабря 2011

У меня есть динамически созданный путь к файлу в haskell, который заканчивается примерно так:

/abc/def/../ghi/./jkl

, и я хотел бы уменьшить его до более читабельного

/abc/ghi/jkl

Дляпечать.Есть ли библиотечная функция для этого в haskell?Я просмотрел все и не могу найти один.Это не так сложно написать, но это немного грязно, потому что вы должны «смотреть вперед» для «..», и я бы предпочел использовать функцию «запеканки», если смогу.

Ответы [ 2 ]

15 голосов
/ 15 декабря 2011

Помните, что это не просто вопрос обработки строки, когда задействованы ссылки:

$ mkdir -p foo/bar
$ ln -s foo/bar baz
$ echo gotcha! >foo/quux
$ cat quux
cat: quux: No such file or directory
$ cat baz/../quux
gotcha!

Так что вам нужно выполнить ввод-вывод.canonicalizePath из System.Directory.Он возвращает путь, начиная с корневого каталога, поэтому вы можете использовать его вместе с makeRelative, также с System.Directory.Но он работает в IO.

2 голосов
/ 15 декабря 2011

Взгляните на System.FilePath.Posix . Функция normalize делает почти то, что вы хотите:

> normalise "/abc/def/../ghi/./jkl"
"/abc/def/../ghi/jkl"

Вы можете использовать splitDirectories, чтобы разделить имя файла и упростить обработку.

Остерегайтесь крайних случаев, таких как:

/../foo        -- Equal to /foo, at least on my system
../parent/foo  -- Requires a system call to eliminate the possibly-redundant ..
...