【问题标题】:Exclude certain file extensions when getting files from a directory从目录获取文件时排除某些文件扩展名
【发布时间】:2010-10-19 19:15:54
【问题描述】:

从目录中获取文件时如何排除某些文件类型?

我试过了

var files = Directory.GetFiles(jobDir);

但是这个功能好像只能选择你想包含的文件类型,不能排除。

【问题讨论】:

标签: c# file directory


【解决方案1】:

你应该自己过滤这些文件,你可以这样写:

    var files = Directory.GetFiles(jobDir).Where(name => !name.EndsWith(".xml"));

【讨论】:

  • 就我现在而言,EndsWith 考虑了大写字母,这意味着如果文件类型是 .XML,它不会排除它。
  • var files = Directory.GetFiles(jobDir).Where(name => !name.EndsWith(".xml", true));
  • var files = Directory.GetFiles(jobDir).Where(name => !name.EndsWith(".xml", StringComparison.OrdinalIgnoreCase));
  • 为我工作。我只需要添加 .ToList();最后因为我的变量是一个列表:)
  • @m-fawad-surosh 谢谢,很好的评论,我需要一个稍微不同的变体,因为原始的GetFiles 返回string[],我想让我的代码保持相同的约定,我只是打了一个类似的电话:Directory.GetFiles(jobDir).Where(...).ToArra(),还有更多这样的选择!
【解决方案2】:

我知道,这是一个古老的要求,但对我来说它总是很重要。

如果您想排除文件扩展名列表:(基于https://stackoverflow.com/a/19961761/1970301

var exts = new[] { ".mp3", ".jpg" };



public IEnumerable<string> FilterFiles(string path, params string[] exts) {
    return
        Directory
        .GetFiles(path)
        .Where(file => !exts.Any(x => file.EndsWith(x, StringComparison.OrdinalIgnoreCase)));
}

【讨论】:

  • 我正在寻找一种 LINQ 方法来排除多个扩展。我在这里找到了。非常感谢。
【解决方案3】:

你可以试试这样的:

  var allFiles = Directory.GetFiles(@"C:\Path\", "");
  var filesToExclude = Directory.GetFiles(@"C:\Path\", "*.txt");
  var wantedFiles = allFiles.Except(filesToExclude);

【讨论】:

  • 这在所有形式的 GetFiles() 命令中都非常有效。它不能精确地解决问题,但是您可以利用 searchPattern 参数获得额外的好处,它比仅查看扩展更强大。
  • 建议:这不适用于实例方法DirectoryInfo.GetFiles():它返回一个 FileInfo 数组(而不是字符串),一个不可比较/不可相等的类。
  • 此解决方案适用于多模式文件排除。谢谢
【解决方案4】:

我猜你可以使用 lambda 表达式

var files = Array.FindAll(Directory.GetFiles(jobDir), x => !x.EndWith(".myext"))

【讨论】:

    【解决方案5】:

    你可以试试这个,

    var directoryInfo = new DirectoryInfo("C:\YourPath");
    var filesInfo = directoryInfo.GetFiles().Where(x => x.Extension != ".pdb");
    

    【讨论】:

      【解决方案6】:

      Afaik 无法指定排除模式。 您必须手动完成,例如:

      string[] files = Directory.GetFiles(myDir);
      foreach(string fileName in files)
      {
          DoSomething(fileName);
      }
      

      【讨论】:

      • 谢谢,但我真的不喜欢手动操作
      • 如果可能的话,也许你可以从基础 System.IO.Directory 派生出你自己的目录类(我没试过)。
      【解决方案7】:

      这是我在上面阅读的答案的版本

      List<FileInfo> fileInfoList = ((DirectoryInfo)new DirectoryInfo(myPath)).GetFiles(fileNameOnly + "*").Where(x => !x.Name.EndsWith(".pdf")).ToList<FileInfo>();
      

      【讨论】:

        【解决方案8】:

        我在寻找一种方法来执行此操作时遇到此问题,其中排除可以使用搜索模式规则,而不仅仅是 EndWith 类型逻辑。

        例如搜索模式通配符说明符匹配:

        • *(星号)该位置有零个或多个字符。
        • ? (问号)该位置有 0 个或一个字符。

        这可以用于上述情况,如下所示。

        string dir = @"C:\Temp";
        var items = Directory.GetFiles(dir, "*.*").Except(Directory.GetFiles(dir, "*.xml"));
        

        或者排除本来应该包含的项目。

        string dir = @"C:\Temp";
        var items = Directory.GetFiles(dir, "*.txt").Except(Directory.GetFiles(dir, "*HOLD*.txt"));
        

        【讨论】:

          【解决方案9】:

          我用过

          Directory.GetFiles(PATH, "*.dll"))

          路径是:

          公共静态字符串_PATH = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);

          【讨论】:

            【解决方案10】:
            string[] filesToDelete = Directory.GetFiles(@"C:\Temp", "*.der");
            
            foreach (string fileName in filesToDelete)
            {
                File.Delete(fileName);
            }
            

            【讨论】:

            • 这是一个解决方案,但非常激进
            • @Chetan 我建议你删除这个答案以避免更多的投票
            猜你喜欢
            • 1970-01-01
            • 2013-08-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-09-26
            • 1970-01-01
            相关资源
            最近更新 更多