检查haskell中的两个目录是否在同一个文件系统中

时间:2014-08-15 20:57:53

标签: linux macos haskell directory filesystems

如果我有两个目录AB如何在OS X和Linux上的Haskell中判断它们是否在同一个文件系统上(例如在同一个硬盘上)?

我检查了System.DirectorySystem.FilePath.Posix这些似乎没有做任何事情。

2 个答案:

答案 0 :(得分:2)

unix软件包中的getFileStatusdeviceID函数可以为您提供帮助。

答案 1 :(得分:2)

一种方法是利用stat实用程序并自己编写一个包装器。 stat可以为您的文件提供设备编号。我在Linux中测试了以下代码,它适用于不同的磁盘(但我对Mac OS不确定):

import Control.Applicative ((<$>))
import System.Process

statDeviceID :: FilePath -> IO String
statDeviceID fp = readProcess "stat" ["--printf=%d", fp] ""
-- for mac which has a different version of stat
-- statDeviceID fp = readProcess "stat" ["-f", "%d", fp] ""

checkSameDevice :: [FilePath] -> IO Bool
checkSameDevice xs = (\x -> all (== head x) x) <$> (sequence $ map statDeviceID xs)

paths = ["/mnt/Books", "/home/sibi"]

main = checkSameDevice paths >>= print

在ghci:

λ> main
False   -- False since /mnt is a different hard disk