我需要能够返回符合某些动态条件的文件列表。我试过用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)");
我希望将其改编为文件系统。所以我可以建立一个过滤字符串并使用它。
答案 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);