【发布时间】:2018-08-06 16:33:55
【问题描述】:
我在 Haskell 方面比较缺乏经验,我想改进,所以对于我的一个学习项目我有以下要求:
- 我想从指定的顶级目录开始搜索,不一定是绝对路径。
- 我想查找给定扩展名的所有文件,比如
.md。 - 我不想搜索隐藏目录,比如
toplevel/.excluded。 - 我希望能够忽略隐藏文件,例如 gedit 生成
.filename.md.swp。 - 我希望得到一个完整的文件列表作为我的函数的结果。
我搜遍了 SO。到目前为止,这是我所拥有的:
import qualified System.FilePath.Find as SFF
import qualified Filesystem.Path.CurrentOS as FP
srcFolderName = "src"
outFolderName = "output"
resFolderName = "res"
ffNotHidden :: SFF.FindClause Bool
ffNotHidden = SFF.fileName SFF./~? ".?*"
ffIsMD :: SFF.FindClause Bool
ffIsMD = SFF.extension SFF.==? ".md" SFF.&&? SFF.fileName SFF./~? ".?*"
findMarkdownSources :: FilePath -> IO [FilePath]
findMarkdownSources filePath = do
paths <- SFF.find ffNotHidden ffIsMD filePath
return paths
这不起作用。 “findMarkdownSources”中的 printf 样式调试,我可以验证 filePath 是否正确,例如"/home/user/testdata"(打印包括“,以防万一)。列表paths总是空的。我绝对确定我指定的目录中有markdown文件(查找/path/to/dir - name "*.md" 找到它们)。
因此我有一些具体的问题。
- 是否有原因(过滤器不正确),例如为什么这段代码不能工作?
-
在 haskell 中有很多方法可以做到这一点。似乎至少有六个包(fileman、system.directory、system.filepath.find)专用于此。以下是一些类似问题的答案:
- Streaming recursive descent of a directory in Haskell
- Is there some directory walker in Haskell?
- avoid recursion into specifc folder using filemanip
每个人都有大约三种独特的方式来实现我想要实现的目标,所以,我们差不多有 10 种方式来实现它......
- 我应该以特定的方式执行此操作吗?如果是,为什么?如果有帮助,一旦我有了我的文件列表,我将遍历整个文件,打开并解析每个文件。
如果有帮助,我对基本的 haskell 相当满意,但如果我们开始对 monad 和应用函子过于繁重,你需要放慢速度(我使用的 haskell 不足以让我记住这一点)。不过,我发现关于 hackage 的 haskell 文档难以理解。
【问题讨论】:
-
GlobPattern的文档没有提到支持?;也许这就是问题的一部分。 -
@DanielWagner 谢谢 好的,我会试试这个。我的答案看起来也不错,我明天也试试。
标签: haskell filepath file-extension