我在haskell中有一个动态构造的文件路径,最终结果如下:
/abc/def/../ghi/./jkl
我希望将其降低到更具可读性
/abc/ghi/jkl
用于打印。在haskell中有一个库函数吗?我看了一遍,找不到一个。写起来并不难,但是它有点乱,因为你必须“向前看”“...”,如果可以,我宁愿使用烘焙功能。
答案 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.Posix。 normalise函数几乎你想要的东西:
> 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 ..