2
Pipes tutorialの読み込みが終了しました。ディレクトリ内のすべてのファイルを再帰的に一覧表示する関数を作成したかったのです。私は、次のコードで試してみました: ディレクトリ内のすべてのファイルをパイプで再帰的にリスト表示
enumFiles :: FilePath -> Producer' FilePath (PS.SafeT IO)()
enumFiles path =
PS.bracket (openDirStream path) (closeDirStream) loop
where
loop :: DirStream -> Producer' FilePath (PS.SafeT IO)()
loop ds = PS.liftBase (readDirStream ds) >>= checkName
where
checkName :: FilePath -> Producer' FilePath (PS.SafeT IO)()
checkName "" = return()
checkName "." = loop ds
checkName ".." = loop ds
checkName name = PS.liftBase (getSymbolicLinkStatus newPath)
>>= checkStat newPath
where newPath = path </> name
checkStat path stat
| isRegularFile stat = yield path >> loop ds
| isDirectory stat = enumFiles path
| otherwise = loop ds
しかし、このプロデューサーはすぐ
return()
に到達すると終了します。私は正しい方法でそれを作っていないと思うが、これを行う正しい方法は何か分からない。
私は、あなたがしたように問題を解消することは考えていません。非常に素晴らしい。おそらく、これは別のSOの質問の質問ですが、このアプローチでは、深い最初の検索順序で訪問しているので、オープンディレクトリの制限に達する可能性があります。 –
@DamianNadales私はディレクトリがそのように動作するとは思わない。 1つを開いてハンドルを取得せず、その内容をリストするためにカーソルのように使用します。あなたは単にファイルパスを持っていて、システムコールを作成したときにそのパスの内容のリストを与えるシステムコールを作成するだけです。 – Carl
私は、ディレクトリストリームをカーソルとして使用していると思っていました。私はそれを開いていて、その内容を使って繰り返しました: 'readDirStream stream' ... –