2011-12-15 36 views
11

Tôi có một đường dẫn tập tin tự động xây dựng trong Haskell rằng kết thúc một cái gì đó như thế này:Haskell hoạt động đường dẫn tập tin tối nghĩa (đơn giản hóa đi các dấu chấm)

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

và tôi muốn giảm nó vào dễ đọc hơn

/abc/ghi/jkl 

Để in. Có một chức năng thư viện để làm điều này trong haskell? Tôi đã xem xét tất cả và không thể tìm thấy một. Nó không phải là quá khó để viết, nhưng đó là một chút lộn xộn bởi vì bạn phải "nhìn về phía trước" cho ".." s, và tôi muốn sử dụng một chức năng nướng trong nếu tôi có thể.

Trả lời

15

Cẩn thận rằng đây không phải chỉ đơn giản là một câu hỏi xử lý chuỗi khi liên kết có liên quan đến:

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

Vì vậy, bạn cần phải làm IO.

Tôi gần nhất có thể tìm thấy những gì bạn muốn là canonicalizePath từ System.Directory. Nó trả về một đường dẫn bắt đầu từ thư mục gốc, vì vậy bạn có thể muốn sử dụng nó cùng với makeRelative, cũng từ System.Directory. Nhưng nó chạy trong IO.

2

Hãy xem System.FilePath.Posix. Chức năng normalise không gần những gì bạn muốn:

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

Bạn có thể sử dụng splitDirectories để phân chia các tên file và đơn giản hóa chế biến.

Cẩn thận với các trường hợp cạnh như:

/../foo  -- Equal to /foo, at least on my system 
../parent/foo -- Requires a system call to eliminate the possibly-redundant .. 
Các vấn đề liên quan