【问题标题】:Delete Doc files and keep Docx files [duplicate]删除Doc文件并保留Docx文件[重复]
【发布时间】:2015-11-30 16:10:48
【问题描述】:

我正在尝试删除还包含 .docx 文件的文件夹中的 .doc 文件。

这是我目前的尝试:

string[] files = Directory.GetFiles(Path, "*.doc", SearchOption.AllDirectories);

foreach (string f in files)
{
    File.Delete(f);
}

它删除扩展名为.doc.docx的word文档。 我只想删除.doc 文件并保留.docx 文件。

【问题讨论】:

    标签: c# winforms


    【解决方案1】:

    Directory.GetFiles Method (String, String, SearchOption) 的 MSDN 文档包括以下说明:

    当您在 searchPattern 中使用星号通配符时 如“*.txt”,指定扩展名中的字符数 影响搜索如下:

    •如果指定的扩展名正好是三个字符长,则 方法返回扩展名以指定开头的文件 延期。例如,“*.xls”返回“book.xls”和 “书.xlsx”。

    •在所有其他情况下,该方法返回与 指定的扩展名。例如,“*.ai”返回“file.ai”,但不返回 “文件.aif”。

    当你使用问号通配符时,此方法返回 仅匹配指定文件扩展名的文件。例如,给定 两个文件,“file1.txt”和“file1.txtother”,在一个目录中,搜索 "file?.txt" 的模式只返回第一个文件,而搜索 “file*.txt”的模式返回两个文件。

    解决 Microsoft 以这种方式“提供帮助”的最简单方法是过滤 Directory.GetFiles 调用的结果:

    string[] files = Directory.GetFiles(filesPath, "*.doc", SearchOption.AllDirectories);
    
    foreach (string f in files.Where(f => Path.GetExtension(f) == ".doc"))
    {
        File.Delete(f);
    }
    

    我重命名了您的 Path 变量,因为它与包含静态 GetExtension 方法的 System.IO.Path 类冲突。作为一般经验法则,为变量赋予与现有类相同的名称是一个坏习惯。

    【讨论】:

      【解决方案2】:
              string[] files = Directory.GetFiles(Path, "*.doc", SearchOption.AllDirectories);
              foreach (string f in files.Where(f => !f.EndsWith(".docx")))
              {
                  File.Delete(f);
              }
      

      Microsoft 在 DirectoryInfo.GetFiles Method (String, SearchOption) (https://msdn.microsoft.com/en-us/library/ms143327(v=vs.110).aspx) 方法概述中提供了此问题的示例。他们说:

      以下列表显示了 searchPattern 参数的不同长度的行为:

      • “*.abc”返回具有扩展名的文件 of.abc、.abcd、.abcde、.abcdef 等等。
      • “*.abcd”仅返回扩展名为 .abcd 的文件。
      • “*.abcde”仅返回扩展名为 .abcde 的文件。
      • “*.abcdef”仅返回扩展名为 .abcdef 的文件。

      您需要过滤 Directory.GetFiles 的结果集,以便您只对所需的文件进行操作。

      【讨论】:

        【解决方案3】:

        您可以获得第一个扩展名,检查 .doc 文件。然后调用删除函数。

        string extension = System.IO.Path.GetExtension(@"c:\yourfile.docx");
        if(extension != ".docx")
        {
           //DELETE FILE HERE
        }
        

        【讨论】:

        • 这不会删除任何不等于传递给 GetExtension 的 .docx 的文件吗?即使文件是.DOCX?它仍然会被删除
        • 我们在那里放置了一个 checkl if(extension != ".docx") 。所以你只会得到那些扩展名不等于(!=)'.docx'的文件
        【解决方案4】:

        出现该问题是因为 Windows 会忽略文件扩展名中长度超过 3 个字符的任何部分。

        将您的代码更改为此将解决它:

        var files = Directory
           .GetFiles(Path, "*.doc", SearchOption.AllDirectories)
           .Where(w => w.ToLowerInvariant().EndsWith(".doc"));
        

        【讨论】:

        • 这个答案对我有用
        • 声明“出现该问题是因为 Windows 忽略了长度超过 3 个字符的文件扩展名的任何部分。” 错误。 OP 遇到了微软试图“提供帮助”的地方,结果反而令人困惑。请参阅MSDN documentation
        • 当您说:“试图成为“有帮助的””时 - 您的意思是它忽略了文件扩展名中超过 3 位数的任何部分吗?在我看来,“忽略数字”和“乐于助人”是没有区别的区别。 :)
        • @Ulric: 不,'试图成为“有帮助的”'我的意思是,“在三字母文件扩展名的特定情况下它返回带有扩展名的文件从这三个字符开始”。 IIRC,微软在 Office 2007 推出时加入了这个黑客,因此用(例如)“*.ppt”硬编码的文件对话框将显示所有 PowerPoint 文档(无论是使用 .ppt 还是 .pptx 扩展名)。如果您在扩展名中传递的通配符少于或多于三个字符,Directory.GetFiles 将按照您的预期工作(仅返回与扩展名匹配的文件)。
        • “我的意思是,“在三字母文件扩展名的特定情况下,它返回扩展名以这三个字符开头的文件”。” ...这涉及忽略文件扩展名中超过 3 位数的任何部分。正如我所说:没有区别的区别。
        【解决方案5】:

        你可以试试

        DirectoryInfo Dir = new DirectoryInfo(path);
        
        
        foreach (FileInfo file in Dir.GetFiles())
        {
        
            //Code
        }
        

        因为您可以使用

        访问文件扩展名
        file.Extension
        

        像这样。我想这样使用起来更安全

        【讨论】:

        • 以上是一个很好的方法,只是一个想法,但您可能还需要考虑文件类型的大小写,即上/下。
        • 所以使用 String.ToLower()
        【解决方案6】:

        过滤结果以获得您所追求的确切扩展名。

        string[] files = Directory.GetFiles(Path, "*.doc", SearchOption.AllDirectories);
        foreach (string f in files.Where(f => String.Compare(".doc", f.Extension, StringComparison.OrdinalIgnoreCase) == 0))
        {
            File.Delete(f);
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-07-28
          • 2021-05-04
          • 2019-02-12
          • 1970-01-01
          • 2018-06-13
          相关资源
          最近更新 更多