2011-12-20 81 views
15

有沒有辦法用目標文件的絕對路徑返回目錄中的文件列表。Haskell中的目錄內容

當我做

getDirectoryContents dir 

它給我的目錄文件名列表。如果我在其他地方使用這些文件名,我需要知道它們的絕對路徑或相對於當前工作目錄的路徑。

回答

16
getAbsDirectoryContents :: FilePath -> IO [FilePath] 
getAbsDirectoryContents dir = 
    getDirectoryContents dir >>= mapM (canonicalizePath . (dir </>)) 

這使用System.Directory.canonicalizePath,並且(如果你打電話getAbsDirectoryContents "foo",然後在文件系統中移動到別處例如)即使dir不是絕對路徑工程。

如果你知道dir是絕對路徑,你可以改用:

getAbsDirectoryContents :: FilePath -> IO [FilePath] 
getAbsDirectoryContents dir = map (dir </>) <$> getDirectoryContents dir 

它採用System.FilePath.(</>),並且可能會快一點。

+1

可能是值得注意的是,此解決方案的工作,你需要導入System.FilePath()和Data.Functor(<$>) – 2012-02-18 23:14:00

3
import System.Directory (getDirectoryContents) 
import System.FilePath ((</>)) 

getAbsoluteDirContents :: String -> IO [FilePath] 
getAbsoluteDirContents dir = do 
    contents <- getDirectoryContents dir 
    return $ map (dir </>) contents