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


219

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

if exist "C:\test.txt"

delete "C:\test.txt"

else 

return nothing (ignore)

Answers:


387

使用File类非常简单。

if(File.Exists(@"C:\test.txt"))
{
    File.Delete(@"C:\test.txt");
}


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


13
实际不需要该测试。看我的帖子。
克里斯·

20
如果要防止可能的DirectoryNotFoundException,则必须进行测试。
Timothy Strimple 2011年

7
该测试不应代替异常处理,而应与之配合使用。任何数量的方案都可能导致存在检查返回true和Delete抛出。
乔什(Josh)

1
为什么@在文件路径之前有一个?对我来说,没有它。
Pascal Ackermann

5
@使您不必加倍反斜杠。
PRMan

105

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

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

从文档中:

如果要删除的文件不存在,则不会引发异常。


7
如果“指定的路径无效(例如,它在未映射的驱动器上),则将抛出DirectoryNotFoundException。”
蒂莫西·斯特拉夫

5
真奇怪 Intellisense说An exception is thrown if the specified file does not exist
fearofawhackplanet 2011年

也许您正在使用其他版本的.NET框架?
克里斯·埃伯勒

1
我正在使用.Net4,看来intellisense是错误的,我运行了检查并且未引发任何异常
fearofawhackplanet

3
是的,我尝试了System.IO.File.Delete(@"C:\test.txt");就足够了。谢谢
BerkayTurancı2012年

33

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

using System.IO;

如果文件路径表示文件的完整路径,则可以按以下步骤检查文件的存在并将其删除:

if(File.Exists(filepath))
{
     try
    {
         File.Delete(filepath);
    } 
    catch(Exception ex)
    {
      //Do something
    } 
}  

2
为什么不随便发出Delete调用并捕获任何表明该文件不存在的异常?
antred

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

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

只要文件夹存在,它将执行相同的操作。


23

如果要避免使用a DirectoryNotFoundException,则需要确保文件目录确实存在。File.Exists完成此任务。另一种方法是像这样利用PathDirectory实用程序类:

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

15
  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;
        }
    }


1

如果要使用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();
vapcguy

1

有时,无论如何都希望删除文件(无论发生什么异常,请务必删除文件)。对于这种情况。

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);
            }
        }

注意:如果指定的文件不存在,则不会引发异常。


10
因此,您尝试每秒删除文件20次,直到删除为止。如果由于某种原因无法删除文件而程序将尝试永久删除该怎么办?我认为这不是一个好的解决方案。
kv1dr

2
至少,您应该提供一个超时参数。
antred

@ kv1dr对。我认为您应该在有限的时间内尝试并返回失败消息(如果未删除文件)。
QMaster

0

这将是最简单的方法,

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);
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.