3

我需要能够返回满足某些动态标准的文件列表。我尝试使用 LINQ 来做到这一点。

我发现可以使用Scott Gu 的博客中提到的 System.Linq.Dynamic 命名空间来使用动态 LINQ 。

但我不确定是否可以用于我需要的用途。

到目前为止,我得到了所有文件,但我不确定从那里去哪里。

// Take a snapshot of the file system.
System.IO.DirectoryInfo dir = new System.IO.DirectoryInfo(SourceLocation);

// This method assumes that the application has discovery permissions
// for all folders under the specified path.
IEnumerable<System.IO.FileInfo> fileList = dir.GetFiles("*.*", System.IO.SearchOption.AllDirectories);

我现在需要能够使用用户创建的一些动态过滤器来过滤这些文件。例如扩展名 = .txt

谁能指出我正确的方向?

谢谢。马丁。

编辑:

Dynamic Linq 库中的示例如下所示:

var query =
            db.Customers.Where("City == @0 and Orders.Count >= @1", "London", 10).
            OrderBy("CompanyName").
            Select("New(CompanyName as Name, Phone)");

我希望将其用于文件系统。所以我可以建立一个过滤器字符串并使用它。

4

3 回答 3

3

这是我用过的方法。

var diSource = new DirectoryInfo(SourceLocation);            
var files = GetFilesRecursive(diSource);
var matches = files.AsQueryable().Where(sFilter, oParams);

SourceLocation 只是我希望搜索的目录的文件路径。GetFileRecursive 只是返回子文件夹中所有文件的自定义方法。

我根据用户定义的过滤器构建 sFilter 参数,oParams 是这些过滤器值的数组。这允许我的用户根据需要动态定义尽可能多的过滤器。

于 2010-07-12T08:43:14.507 回答
2
var files = fileList.Where(
    f => f.Modified > DateAdd(DateInterval.Days, -1, DateTime.Now);

或者

var files = fileList.Where(f => f.Name.EndsWith(".txt"));

或者

var files = fileList.Where(f => f.IsReadOnly);

这是 LINQ。在该f => f.部分中,您可以放置​​任何计算结果为布尔值的表达式。天空是极限。您可以编写一个函数,它接受一个FileInfo对象,读取文件的文本,如果它包含特定的短语,则返回 true。那你就这么干吧……

var files = fileList.Where(f => MyFunction(f));

关于用户创建的过滤器,您确实必须设计适合可能情况的 UI 和后端。

于 2010-07-08T13:57:38.427 回答
0

除非您使用 fileinfo 属性作为过滤的一部分,否则您可以简单地使用以下内容:

IEnumerable<System.IO.FileInfo> fileList = dir.GetFiles(**"*.txt"**,
 System.IO.SearchOption.AllDirectories);
于 2016-03-29T06:45:28.603 回答