使用LINQ动态查询文件系统信息

时间:2010-07-08 13:49:09

标签: c# linq dynamic-linq

我需要能够返回符合某些动态条件的文件列表。我试过用LINQ做这个。

我发现可以使用Scott Gu's Blog中提到的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);

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

有人能指出我正确的方向吗?

感谢。 马丁。

编辑:

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

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

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

3 个答案:

答案 0 :(得分:3)

这是我用过的方法。

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

SourceLocation只是我想要搜索的目录的文件路径。 GetFileRecursive只是一个自定义方法,用于返回子文件夹中的所有文件。

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

答案 1 :(得分: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和后端。

答案 2 :(得分:0)

除非您在过滤过程中使用fileinfo属性,否则只需使用以下内容:

IEnumerable<System.IO.FileInfo> fileList = dir.GetFiles(**"*.txt"**,
 System.IO.SearchOption.AllDirectories);