Sto provando a fare una discesa ricorsiva di una struttura di directory usando Haskell. Mi piacerebbe solo recuperare le directory e i file secondari, se necessario (pigramente).Scorrimento ricorsivo di una directory in Haskell
ho scritto il seguente codice, ma quando l'eseguo, la traccia mostra che tutte le directory sono visitati prima che il primo file:
module Main where
import Control.Monad (forM, forM_, liftM)
import Debug.Trace (trace)
import System.Directory (doesDirectoryExist, getDirectoryContents)
import System.Environment (getArgs)
import System.FilePath ((</>))
-- From Real World Haskell, p. 214
getRecursiveContents :: FilePath -> IO [FilePath]
getRecursiveContents topPath = do
names <- getDirectoryContents topPath
let
properNames =
filter (`notElem` [".", ".."]) $
trace ("Processing " ++ topPath) names
paths <- forM properNames $ \name -> do
let path = topPath </> name
isDirectory <- doesDirectoryExist path
if isDirectory
then getRecursiveContents path
else return [path]
return (concat paths)
main :: IO()
main = do
[path] <- getArgs
files <- getRecursiveContents path
forM_ files $ \file -> putStrLn $ "Found file " ++ file
Come posso alternare l'elaborazione dei file con la discesa? Il problema è che l'azione files <- getRecursiveContents path
viene eseguita prima del seguente forM_
in main
?
La successiva sezione denominata "Un altro modo di guardare attraversamento" nel [ "Ricerca il filesystem "] (http://book.realworldhaskell.org/read/io-case-study-a-library-for-searching-the-filesystem.html) capitolo di Real World Haskell offre anche un modo più flessibile di navigare il file sistema che utilizza una piega e un iteratore. –
I (ovviamente) ha preso la funzione 'getRecursiveContents' da RWH. Non ho visto la sezione successiva. Darò un'occhiata. Grazie. – Ralph
Si consiglia di controllare http://hackage.haskell.org/package/FilePather – singpolyma