Haskell模糊文件路径操作(简化点)

时间:2011-12-15 04:10:10

标签: haskell filepath

我在haskell中有一个动态构造的文件路径,最终结果如下:

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

我希望将其降低到更具可读性

/abc/ghi/jkl

用于打印。在haskell中有一个库函数吗?我看了一遍,找不到一个。写起来并不难,但是它有点乱,因为你必须“向前看”“...”,如果可以,我宁愿使用烘焙功能。

2 个答案:

答案 0 :(得分: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!

所以你需要做IO。

我可以从System.Directory找到你想要的最近的canonicalizePath。它返回从根目录开始的路径,因此您可能希望将其与makeRelative结合使用,同样来自System.Directory。但它确实在IO中运行。

答案 1 :(得分:2)

看看System.FilePath.Posixnormalise函数几乎你想要的东西:

> 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 ..