【问题标题】:How to delete file of certain extension?如何删除某些扩展名的文件?
【发布时间】:2020-11-10 19:48:50
【问题描述】:

我有一个应用程序应该解压缩并安装一些其他应用程序,我通过网络获取带有安装映像的新 Zip 文件,然后应该解压缩并安装它。由于版本更改,除 Zip 文件每次都带有不同名称的部分之外的所有文件,并且我所有的 C:\ 都有很多不同版本的 .zip 文件。 Msi 文件不会被我正在使用的 Zip 覆盖,但我只需在解压缩之前将其删除即可。

我想删除 C: 上的所有 .msi 和 .zip 文件。 我如何通过 C# 做到这一点?

谢谢...

【问题讨论】:

    标签: c# .net


    【解决方案1】:

    你可以试试这样的:

    DirectoryInfo di = new DirectoryInfo(@"C:\");
    FileInfo[] files = di.GetFiles("*.msi")
                         .Where(p => p.Extension == ".msi").ToArray();
    foreach (FileInfo file in files)
        try
        {
            file.Attributes = FileAttributes.Normal;
            File.Delete(file.FullName);
        }
        catch { }
    

    请注意,我首先尝试将属性设置为“正常”,因为如果文件是只读的,File.Delete() 会失败...
    注意GetFiles()的使用:详见this link

    已编辑:
    如果您需要获得多个扩展,您可以使用这个:

    public List<FileInfo> GetFiles(string path, params string[] extensions)
    {
        List<FileInfo> list = new List<FileInfo>();
        foreach (string ext in extensions)
            list.AddRange(new DirectoryInfo(path).GetFiles("*" + ext).Where(p =>
                  p.Extension.Equals(ext,StringComparison.CurrentCultureIgnoreCase))
                  .ToArray());
        return list;
    }
    

    所以你可以将我的部分答案更改为

    List<FileInfo> files = GetFiles(@"C:\", ".msi", ".zip");
    

    【讨论】:

    • FileAttributes 的变化给了我什么?
    • @eugeneK:如果文件具有属性 R(只读)或 H(隐藏),File.Delete() 根本不会删除它。将属性重置为 normal 即可。
    • @eugeneK:我编辑了我的帖子以提供一个示例,说明如何一步获得多个扩展
    • GetFiles 会只获取 *.msi 文件还是也获取 *.MsI?
    • @eugeneK: GetFiles() 两者都得到,但如果存在 file1.msis 也需要 ;)
    【解决方案2】:
    foreach (string file in Directory.GetFiles("C:\\myDir", "*.zip").Where(item => item.EndsWith(".zip")))
    {
        File.Delete(file);
    }
    

    您可以通过更改 GetFiles 算法来使用更多模式

    public FileInfo[] GetFiles(DirectoryInfo dir, string searchPatterns, params char[] separator)
    {
       ArrayList files = new ArrayList();
       string[] patterns = searchPatterns.Split(separator);
       foreach (string pattern in patterns)
       {
          if (pattern.Length != 0)
          {
             files.AddRange(dir.GetFiles(pattern).Where(item => item.EndsWith(pattern));
          }
       }
       return (FileInfo[])files.ToArray(typeof(FileInfo));
    }
    

    【讨论】:

    • 我有两个扩展,我可以将扩展数组传递给 GetFiles 吗?
    • 我为更多的模式添加了一个小功能
    • 如果有扩展名为 .zipp 的文件(例如),它将被包含并使用此代码删除;)
    • 感谢您的快速回答和您所做的工作......不知何故,我更喜欢 Marco 的解决方案。
    【解决方案3】:

    你可以这样做:

    Directory.EnumerateFiles("C:\\MyDirectory", "*.ext").ToList().ForEach(x => File.Delete(x));
    

    别忘了包含 System.IO

    【讨论】:

    • 虽然使用EnumerateFiles() 而不是GetFiles() 是一件好事,但您应该抛弃ToList()。否则你赢了t benefit from the laziness of the enumeration (which leads to the same as if you would use GetFiles(). In that case you either have to add our own ForEach()`扩展IEnumerable或者你简单地切换回正常的foreach循环。
    【解决方案4】:
    var files = Directory.GetFiles(@"C:\", "*.*", SearchOption.AllDirectories)
                .Where(s => s.EndsWith(".msi") || s.EndsWith(".zip"));
    
    foreach (string file in files)
    {
       File.Delete(file);
    }
    

    【讨论】:

    • 这不是很糟糕吗?您读出所有文件,然后限制搜索模式。如果您有一个包含 10.000 个文件的文件夹并且只有 10 个文件属于该模式,那么它的性能不是很好
    • 如果你用一个扩展名调用两次,你需要检查每个文件 twise :)
    • @masterchris_99:他的代码不公平(恕我直言),但他检查了正确的扩展名,而您的代码(正如我在您的回答中评论的那样)不是。查看我的答案并打开我提供的链接以了解 GetFiles("*.zip") 还包含文件 .zipp、.zipt 等...
    • @eugeneK:有两个原因。 1)它获取所有文件,然后过滤它们(如果您只需要*.zip,则没有理由获取*.*); 2)与任何其他答案一样,此答案不会检查扩展名是大写还是小写(或混合),因此例如您不会得到 file2.MSI 。无论如何,我更喜欢这个解决方案,因为在使用GetFiles() 之后,他是唯一一个(除了我)检查正确扩展名的人。所以它非常好,但应该使用我已经在我编辑的答案中写的细节进行改进。
    • 正如您在我的 cmets 中看到的那样,我认为您的解决方案并不完美但相当不错,所以 +1 给您 :)
    【解决方案5】:

    C# System.IO.Directory 对象可让您查找文件(例如 *.zip),而 System.IO.File 可让您删除它们:

    http://msdn.microsoft.com/en-us/library/wz42302f.aspx

    http://msdn.microsoft.com/en-us/library/system.io.file.aspx

    此外,.Net 3.5++ 文件“ZipPackage”可以让您直接在 .zip 文件中执行部分/全部操作(不必先提取任何内容):

    http://msdn.microsoft.com/en-us/library/system.io.packaging.zippackage%28v=VS.90%29.aspx

    【讨论】:

      【解决方案6】:

      您可以列出所有具有特定扩展名的文件 并删除所有

          var list = System.IO.Directory.GetFiles("*.zip");
          foreach (var item in list)
          {
              System.IO.File.Delete(item);
          }
      

      【讨论】:

      • 如果有扩展名为 .zipp 的文件(例如),它将被包含并使用此代码删除;)
      • 好吧,我们应该像其他人说的那样使用 EndWidth
      • 不,那是错误的!您只能使用大小写获得扩展名:如果您使用 *.sys,您将不会获得 file.SYS!您应该使用我在编辑后的答案中写的方法。
      • 是的,我说的和其他人说的一样,我的意思是。Where(item=>item.FullName.EndsWith(...)) ..
      • 这是不正确的:如果它们具有不同大小写的扩展名(大写或小写),您将不会获得所有文件。例如,如果您使用 "*.zip",您将不会获得 file1.ZIP ;)
      【解决方案7】:
      Directory.GetFiles(@"C:\", "*.pdf").ToList().ForEach(f => File.Delete(f));
      

      【讨论】:

        猜你喜欢
        • 2017-05-05
        • 2020-07-20
        • 1970-01-01
        • 2020-02-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-06
        相关资源
        最近更新 更多