2011-12-20 11 views
15

Czy istnieje sposób zwracania listy plików w katalogu z ich bezwzględnymi ścieżkami.Zawartość katalogu w Haskell

Kiedy zrobić

getDirectoryContents dir 

daje mi listę nazw plików w katalogu. Jeśli używam tych nazw plików w innym miejscu, potrzebuję znać ich bezwzględne ścieżki lub ścieżki w stosunku do bieżącego katalogu roboczego.

Odpowiedz

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

używa System.Directory.canonicalizePath i działa nawet jeśli dir nie jest absolutna ścieżka (na przykład jeśli zadzwonisz getAbsDirectoryContents "foo" a następnie przenieść gdzie indziej w systemie plików).

Jeśli wiesz, że dir jest ścieżka bezwzględna, można zamiast tego użyć:

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

który wykorzystuje System.FilePath.(</>) i może być nieco szybciej.

+1

Może warto zauważyć, że na to rozwiązanie do pracy, trzeba importować System.FilePath () i Data.Functor (<$>) –

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

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