2011-12-15 5 views
11

Mam dynamicznie zbudowany ścieżkę w Haskell, który kończy się mniej więcej tak:Haskell niejasne operacje ścieżka pliku (uproszczenia dala kropki)

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

i chciałbym je zmniejszyć do bardziej czytelny

/abc/ghi/jkl 

Do drukowania. Czy istnieje funkcja biblioteki do tego celu w haskell? Rozglądałem się i nie mogę go znaleźć. Nie jest to zbyt trudne do napisania, ale jest trochę bałaganiarski, ponieważ musisz "patrzeć w przyszłość" na "...", a ja wolałbym użyć funkcji wypieku, jeśli mogę.

Odpowiedz

15

Pamiętaj, że nie jest to po prostu kwestia przetwarzania ciąg, gdy zaangażowane są linki:

$ 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! 

Więc trzeba zrobić IO.

Najbliższa pozycja, jaką mogę znaleźć, to canonicalizePath z System.Directory. Zwraca ścieżkę rozpoczynającą się od katalogu głównego, więc możesz użyć go w połączeniu z makeRelative, również z System.Directory. Ale działa w IO.

2

Spójrz na System.FilePath.Posix. Funkcja normalise robi prawie co chcesz:

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

Można użyć splitDirectories podzielić nazwę pliku i uprościć przetwarzanie.

Strzeż przypadków brzegowych, takich jak:

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