2011-12-15 10 views
11

böyle bir şey biter Haskell bir dinamik inşa dosya yolu vardır:Haskell belirsiz dosya yolu işlemleri (noktalar uzakta basitleştirmek)

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

ve ben

daha okunabilir düşürün istiyorum
/abc/ghi/jkl 

Yazdırma için. Bunu haskell'de yapacak bir kütüphane işlevi var mı? Her yere baktım ve bir tane bulamıyorum. Yazmak çok zor değil, ama biraz dağınık çünkü ".." için "ileriye bakmak" zorundasınız ve eğer yapabilirsem fırında pişirmeyi tercih ederim.

cevap

15

:

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

Yani IO yapmanız gereken

gibi uç örnekleri dikkat edin.

İstediğinizi bulabileceğinize en yakın olan canonicalizePath, System.Directory. Kök dizinden başlayarak bir yol döndürür, böylece makeRelative ile birlikte System.Directory'dan da kullanmak isteyebilirsiniz. Ancak IO'da çalışır.

2

System.FilePath.Posix'a bakın. normalise fonksiyon istediğini neredeyse yapar:

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

Dosya adını bölünmüş ve işlenmesini kolaylaştırmak amacıyla splitDirectories kullanabilirsiniz. bağlantılar söz konusu olduğunda bu basit bir dize işleme soru olmadığını dikkat

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