【问题标题】:C# Searching for files and folders except in certain foldersC#搜索文件和文件夹,除了某些文件夹
【发布时间】:2013-10-16 12:29:37
【问题描述】:

有没有办法使用 LINQ 命令like this从 SearchOption 中排除某些目录

string path = "C:\SomeFolder";

var s1 = Directory.GetFiles(path , "*.*", SearchOption.AllDirectories);

var s2 = Directory.GetDirectories(path , "*.*", SearchOption.AllDirectories);

路径由包含某些文件的 Sub1 和 Sub2 文件夹组成。我需要将它们从目录搜索中排除。

谢谢

成功了:

string[] exceptions = new string[] { "c:\\SomeFolder\\sub1",
"c:\\SomeFolder\\sub2" };

var s1 = Directory.GetFiles("c:\\x86", "*.*",
SearchOption.AllDirectories).Where(d => exceptions.All(e =>
!d.StartsWith(e)));

This 帮助处理异常

【问题讨论】:

    标签: c# .net linq file directory


    【解决方案1】:

    不,据我所知没有。但是您可以使用非常简单的 LINQ 在一行中完成。

    var s1 = Directory.GetFiles(path , "*.*", SearchOption.AllDirectories).Where(d => !d.StartsWith("<EXCLUDE_DIR_PATH>")).ToArray();
    

    您也可以轻松组合多个排除 DIR。

    【讨论】:

    • 这里实际上是过滤返回的文件,而不是目录。
    • @Olly: GetFiles() 返回所有文件的完全限定路径,因此使用StartsWith() 执行Where 将基本上返回OP 正在寻找的内容。
    • 啊,是的。又好又简单!
    【解决方案2】:

    您无法使用简单的 LINQ 方法完全满足您的需求。您将需要编写一个递归例程而不是使用SearchOption.AllDirectories。原因是您要过滤 directories 而不是 files

    您可以使用以下静态方法来实现您想要的:

    public static IEnumerable<string> GetFiles(
        string rootDirectory,
        Func<string, bool> directoryFilter,
        string filePattern)
    {
        foreach (string matchedFile in Directory.GetFiles(rootDirectory, filePattern, SearchOption.TopDirectoryOnly))
        {
            yield return matchedFile;
        }
    
        var matchedDirectories = Directory.GetDirectories(rootDirectory, "*.*", SearchOption.TopDirectoryOnly)
            .Where(directoryFilter);
    
        foreach (var dir in matchedDirectories)
        {
            foreach (var file in GetFiles(dir, directoryFilter, filePattern))
            {
                yield return file;
            }
        }
    }
    

    你会这样使用它:

    var files = GetFiles("C:\\SearchDirectory", d => !d.Contains("AvoidMe", StringComparison.OrdinalIgnoreCase), "*.*");
    

    为什么会增加复杂性?这种方法完全避免在您不感兴趣的目录中查找。顾名思义,SearchOption.AllDirectories 将在所有中搜索目录。

    如果您不熟悉迭代器方法(yield return 语法),可以用不同的方式编写:问吧!

    另类

    这有几乎相同的效果。但是,它仍然会在您要忽略的目录的子目录中找到文件。也许这对你没问题;代码更容易理解。

    public static IEnumerable<string> GetFilesLinq(
        string root,
        Func<string, bool> directoryFilter,
        string filePattern)
    {
        var directories = Directory.GetDirectories(root, "*.*", SearchOption.AllDirectories)
            .Where(directoryFilter);
    
        List<string> results = new List<string>();
    
        foreach (var d in directories)
        {
            results.AddRange(Directory.GetFiles(d, filePattern, SearchOption.TopDirectoryOnly));
        }
    
        return results;
    }
    

    【讨论】:

    • 最喜欢你的好例子
    【解决方案3】:

    试试这个

     var s2 =  Directory.GetDirectories(dirPath, "*", SearchOption.AllDirectories)
             .Where(directory => !directory.Contains("DirectoryName"));
    

    【讨论】:

      【解决方案4】:
      ///used To Load Files And Folder information Present In Dir In dir
      private void button1_Click(object sender, EventArgs e)
          {
              FileInfo[] fileInfoArr;
              StringBuilder sbr=new StringBuilder();
              StringBuilder sbrfname = new StringBuilder();
              string strpathName = @"C:\Users\prasad\Desktop\Dll";
              DirectoryInfo dir = new DirectoryInfo(strpathName);
              fileInfoArr = dir.GetFiles("*.dll");
      
              //Load Files From RootFolder
              foreach (FileInfo f in fileInfoArr)
              {
                  sbrfname.AppendLine(f.FullName);
              }
              DirectoryInfo[] dirInfos = dir.GetDirectories("*.*");
             //Load Files from folder folder 
              foreach (DirectoryInfo d in dirInfos)
              {
                 fileInfoArr = d.GetFiles("*.dll");
                 foreach (FileInfo f in fileInfoArr)
                 {
                     sbrfname.AppendLine(f.FullName);
                 }
                  sbr.AppendLine(d.ToString());
      
              }
              richTextBox1.Text = sbr.ToString();
              richTextBox2.Text = sbrfname.ToString();
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-29
        • 1970-01-01
        相关资源
        最近更新 更多