Filtern Sie eine Liste von Pfaden, um nur Dateien einzuschließen
Wenn ich eine Liste von @ haFilePaths
, wie kann ich sie filtern, um nur diejenigen zurückzugeben, die reguläre Dateien sind (dh keine Symlinks oder Verzeichnisse)?
Zum Beispiel mitgetDirectoryContents
main = do
contents <- getDirectoryContents "/foo/bar"
let onlyFiles = filterFunction contents in
print onlyFiles
where "filterFunction" ist eine Funktion, die nur das @ zurückgiFilePaths
, die Dateien darstellen.
Die Antwort funktioniert möglicherweise nur unter Linux, die plattformübergreifende Unterstützung wird jedoch bevorzugt.
[EDIT] Die Verwendung von doesDirectoryExist funktioniert nicht wie erwartet. Dieses Skript gibt eine Liste aller Elemente im Verzeichnis aus, nicht nur der Dateien:
module Main where
import System.Directory
import Control.Monad (filterM, liftM)
getFiles :: FilePath -> IO [FilePath]
getFiles root = do
contents <- getDirectoryContents root
filesHere <- filterM (liftM not . doesDirectoryExist) contents
subdirs <- filterM doesDirectoryExist contents
return filesHere
main = do
files <- getFiles "/"
print $ files
Zusätzlich enthalten die variablen Unterverzeichnisse nur"."
und".."
.