在 F# 中获取目录大小的惯用方法

Pow*_*101 2 f#

我想获得总目录大小,包括所有子目录和文件。我认为有两种方法可以做到这一点,第一种是获取所有文件的所有文件属性(.NET 中的 FileInfo)的列表,然后将所有 Length 属性相加,如下所示:

listOfFileInfos |> List.sumBy (fun f -> f.Length)
Run Code Online (Sandbox Code Playgroud)

另一种方法是在我们遍历目录结构时将每个文件的文件大小添加到累加器中。所以我们不会建立一个很大的列表,我们只是在我们进行时添加到总数中。不过,我不太确定如何在 F# 中执行此操作!

哪种方式更地道?第一个对我来说看起来更容易,但我只是函数式编程的初学者。

Tom*_*cek 5

这里的问题不在于如何进行求和(sumBy对此很有效),而是如何迭代所有文件 - 您说要对所有子文件夹执行此操作,这意味着普通Directory.GetFiles不会这样做。

要处理子目录,您可以使用重载SearchOptions

Directory.GetFiles("C:/temp", "*", SearchOption.AllDirectories)
Run Code Online (Sandbox Code Playgroud)

这将返回一个数组,这对于包含大量文件的目录来说可能是浪费的,因此更好的选择是EnumerateFiles,它返回一个惰性序列:

Directory.EnumerateFiles("C:/temp", "*", SearchOption.AllDirectories)
Run Code Online (Sandbox Code Playgroud)

如果然后使用 对长度求和Seq.sumBy,计算将迭代所有文件,而无需构建大型数据结构以将它们全部保存在内存中:

Directory.EnumerateFiles("C:/temp", "*", SearchOption.AllDirectories)
|> Seq.sumBy (fun f -> FileInfo(f).Length)
Run Code Online (Sandbox Code Playgroud)