【问题标题】:Query File System Info Dynamically using LINQ使用 LINQ 动态查询文件系统信息
【发布时间】:2016-03-29 14:48:34
【问题描述】:

我需要能够返回满足某些动态条件的文件列表。我尝试使用 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);

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

谁能指出我正确的方向?

谢谢。 马丁。

编辑:

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

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

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

【问题讨论】:

    标签: c# linq dynamic-linq


    【解决方案1】:

    这是我用过的方法。

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

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

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

    【讨论】:

      【解决方案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 =&gt; f. 部分,您可以放置​​任何计算结果为布尔值的表达式。天空是极限。您可以编写一个函数,它接受一个FileInfo 对象,读取文件的文本,如果它包含特定的短语,则返回true。然后你就这样做......

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

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

      【讨论】:

      • 这对我不起作用,因为我希望能够创建一个动态的标准字符串。显然这可以使用动态 LINQ 库来完成。
      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2010-09-08
        • 1970-01-01
        • 2013-05-09
        • 1970-01-01
        • 1970-01-01
        • 2021-03-30
        • 1970-01-01
        • 2011-05-15
        • 1970-01-01
        相关资源
        最近更新 更多