2011-12-15 14 views
11

私はこのような何かを終わるHaskellでは、動的に構築されたファイルのパスを持っている:Haskellのあいまいなファイルパス操作(ドット離れ簡素化)

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

と私は

より読みにそれを軽減したいと思います
/abc/ghi/jkl 

印刷用。これを行うにはライブラリ機能がありますか?私は全部を見てきて、見つけられません。書き込むのは難しいことではありませんが、 ".."を先読みしなければならないので、ちょっと混乱します。できれば、ベークイン機能を使用したいと思います。

答えて

15

は、次のようなエッジケースに注意してください。

canonicalizePathからSystem.Directoryに最も近いものが見つかりました。これは、ルートディレクトリから始まるパスを返します。したがって、makeRelativeSystem.Directoryと組み合わせて使用​​することもできます。しかし、それはIOで実行されます。

2

System.FilePath.Posixをご覧ください。あなたは、ファイル名を分割して処理を簡素化するためにsplitDirectoriesを使用することができ

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

normalise機能はほとんど何をしたいを行います。

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

は、だから、IOを実行する必要があります。リンクが含まれる場合、これは単純に文字列処理の問題ではないことに注意してください

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