检查文件是不是存在后如何删除

Posted

技术标签:

【中文标题】检查文件是不是存在后如何删除【英文标题】:How to delete a file after checking whether it exists检查文件是否存在后如何删除 【发布时间】:2011-09-17 12:22:14 【问题描述】:

如何在 C# 中删除文件,例如C:\test.txt,虽然应用了与批处理文件中相同的方法,例如

if exist "C:\test.txt"

delete "C:\test.txt"

else 

return nothing (ignore)

【问题讨论】:

【参考方案1】:

使用File 类非常简单。

if(File.Exists(@"C:\test.txt"))

    File.Delete(@"C:\test.txt");


正如 Chris 在 cmets 中指出的那样,您实际上不需要进行 File.Exists 检查,因为如果文件不存在,File.Delete 不会引发异常,尽管如果您使用的是绝对路径,您将需要检查以确保整个文件路径有效。

【讨论】:

实际上不需要该测试。看我的帖子。 如果你想防止可能的 DirectoryNotFoundException,测试是必要的。 测试不应该用来代替异常处理,而应该用来处理它。任意数量的场景都可能导致存在检查返回 true 并引发删除。 为什么文件路径前有@?对我来说,它没有。 @ 使您不必将反斜杠加倍。【参考方案2】:

像这样使用System.IO.File.Delete:

System.IO.File.Delete(@"C:\test.txt")

来自文档:

如果要删除的文件不存在,则不抛出异常。

【讨论】:

如果“指定的路径无效(例如,它位于未映射的驱动器上),则会抛出 DirectoryNotFoundException。” 多么奇怪。 Intellisense 说An exception is thrown if the specified file does not exist 也许您使用的是不同版本的 .NET 框架? 我使用的是 .Net4,看来智能感知是错误的 我已经运行检查,没有抛出异常 是的,我试过了,System.IO.File.Delete(@"C:\test.txt"); 就足够了。谢谢【参考方案3】:

您可以使用以下方法导入 System.IO 命名空间:

using System.IO;

如果filepath代表文件的完整路径,可以检查其是否存在并删除,如下:

if(File.Exists(filepath))

     try
    
         File.Delete(filepath);
     
    catch(Exception ex)
    
      //Do something
     
  

【讨论】:

为什么不直接发出 Delete 调用并捕获任何表明文件不存在的异常? 我想还有更多可以抛出的异常。【参考方案4】:
if (System.IO.File.Exists(@"C:\test.txt"))
    System.IO.File.Delete(@"C:\test.txt"));

但是

System.IO.File.Delete(@"C:\test.txt");

只要文件夹存在,就会这样做。

【讨论】:

【参考方案5】:

如果你想避免DirectoryNotFoundException,你需要确保文件的目录确实存在。 File.Exists 实现了这一点。另一种方法是使用PathDirectory 实用程序类,如下所示:

string file = @"C:\subfolder\test.txt";
if (Directory.Exists(Path.GetDirectoryName(file)))

    File.Delete(file);

【讨论】:

【参考方案6】:
  if (System.IO.File.Exists(@"C:\Users\Public\DeleteTest\test.txt"))
    
        // Use a try block to catch IOExceptions, to 
        // handle the case of the file already being 
        // opened by another process. 
        try
        
            System.IO.File.Delete(@"C:\Users\Public\DeleteTest\test.txt");
        
        catch (System.IO.IOException e)
        
            Console.WriteLine(e.Message);
            return;
        
    

【讨论】:

【参考方案7】:
if (File.Exists(path))

    File.Delete(path);

【讨论】:

【参考方案8】:

如果您正在使用 FileStream 读取该文件,然后想要删除它,请确保在调用 File.Delete(path) 之前关闭 FileStream。我遇到了这个问题。

var filestream = new System.IO.FileStream(@"C:\Test\PutInv.txt", System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.ReadWrite);
filestream.Close();
File.Delete(@"C:\Test\PutInv.txt");

【讨论】:

或使用using 语句,其中File.Delete() 将超出括号。在您的示例中,您还应该执行filestream.Dispose();【参考方案9】:

有时你想删除一个文件(无论发生什么异常,请务必删除该文件)。对于这种情况。

public static void DeleteFile(string path)
        
            if (!File.Exists(path))
            
                return;
            

            bool isDeleted = false;
            while (!isDeleted)
            
                try
                
                    File.Delete(path);
                    isDeleted = true;
                
                catch (Exception e)
                
                
                Thread.Sleep(50);
            
        

注意:如果指定的文件不存在,不会抛出异常。

【讨论】:

所以你试图每秒删除文件 20 次,直到它被删除。如果由于某种原因无法删除文件并且程序会尝试永远删除它怎么办?我认为这不是一个好的解决方案。 至少,你应该提供一个超时参数。 @kv1dr 对。如果文件没有被删除,我认为你应该在有限的时间内尝试并返回失败消息。【参考方案10】:
if (File.Exists(Path.Combine(rootFolder, authorsFile)))    
    
// If file found, delete it    
File.Delete(Path.Combine(rootFolder, authorsFile));    
Console.WriteLine("File deleted.");    
 

动态

 string FilePath = Server.MapPath(@"~/folder/news/" + IdSelect)
 if (System.IO.File.Exists(FilePath + "/" + name+ ".jpg"))
   
    System.IO.File.Delete(FilePath + "/" + name+ ".jpg");
   

删除目录中的所有文件

string[] files = Directory.GetFiles(rootFolder);    
foreach (string file in files)    
    
File.Delete(file);    
Console.WriteLine($"file is deleted.");    

【讨论】:

【参考方案11】:

这将是最简单的方法,

if (System.IO.File.Exists(filePath)) 

  System.IO.File.Delete(filePath);
  System.Threading.Thread.Sleep(20);

Thread.sleep 将有助于完美工作,否则如果我们复制或写入文件将影响下一步。

我做的另一种方法是,

if (System.IO.File.Exists(filePath))

System.GC.Collect();
System.GC.WaitForPendingFinalizers();
System.IO.File.Delete(filePath);

【讨论】:

以上是关于检查文件是不是存在后如何删除的主要内容,如果未能解决你的问题,请参考以下文章

如何检查消息是不是存在? (discord.js)

如何在SQL Server2005数据库中检查一个表是不是存在,如存在就删除表记录,如不存在就建表.

如何检查视图中是不是已经存在约束?

删除边/节点后查询两个节点之间是不是存在路径

合并到 master 后,如何检查来自哪个分支的哪些提交以及从何处删除的合并?

使用bash将文件从已删除文件夹移动到其原始路径应检查原始路径中是不是存在同名文件[重复]