LINQ 和文件目录 (C#)
许多文件系统操作实质上是查询,因此非常适合使用 LINQ 方法。
本部分中的查询是非破坏性查询。 它们不用于更改原始文件或文件夹的内容。 这遵循了查询不应引起任何副作用这条规则。 通常,修改源数据的任何代码(包括执行创建/更新/删除运算符的查询)应与只查询数据的代码分开。
本节包含下列主题:
如何查询具有指定特性或名称的文件 (C#)
演示如何通过检查文件的 FileInfo 对象的一个或多个属性来搜索文件。
如何按扩展名对文件进行分组 (LINQ) (C#)
演示如何根据文件扩展名返回 FileInfo 对象组。
如何查询一组文件夹中的总字节数 (LINQ) (C#)
演示如何返回指定目录树中所有文件的总字节数。
如何比较两个文件夹的内容 (LINQ) (C#)
演示如何返回位于两个指定文件夹中的所有文件,以及仅位于其中一个文件夹中的所有文件。
如何查询目录树中的一个或多个最大的文件 (LINQ) (C#)
演示如何返回目录树中的最大文件、最小文件或指定数量的文件。
如何在目录树中查询重复文件 (LINQ) (C#)
演示如何对出现在指定目录树中多个位置的所有文件名进行分组。 此外,还演示如何根据自定义比较器执行更复杂的比较。
如何查询文件夹中文件的内容 (LINQ) (C#)
演示如何循环访问树中的文件夹,打开每个文件以及查询文件的内容。
注释
创建准确表示文件系统的内容并适当处理异常的数据源,存在一定难度。 本部分中的示例创建 FileInfo 对象的快照集合,该集合表示指定的根文件夹及其所有子文件夹下的所有文件。 每个 FileInfo 的实际状态可能会在开始和结束执行查询期间发生更改。 例如,可以创建 FileInfo 对象的列表来用作数据源。 如果尝试通过查询访问 Length
属性,则 FileInfo 对象会尝试访问文件系统来更新 Length
的值。 如果该文件不再存在,则你会在查询中获得 FileNotFoundException,即使未直接查询文件系统也是如此。 本部分中的一些查询使用不同的方法,在某些情况下使用该方法不会出现这些特定异常。 另一种方法是使用 FileSystemWatcher 保持数据源动态更新。