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

271

我该如何在C#中删除一个文件,例如C:\ test.txt,并应用类似于批处理文件的方法呢?

if exist "C:\test.txt"

delete "C:\test.txt"

else 

return nothing (ignore)
11个回答

464

使用File类非常简单明了。

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


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


18
这个测试其实并不必要。看看我的帖子吧。 - Chris Eberle
29
如果您想避免可能的"DirectoryNotFoundException",进行测试是必要的。 - Timothy Strimple
8
但是这个测试不应该代替异常处理,而应是与之相结合的。有许多情况可能导致存在检查返回 true 和 Delete 抛出异常。 - Josh
3
为什么文件路径前面要加上@符号?我不加也能正常工作。 - Pascal
8
@ 可以避免您不必重复使用反斜杠。 - PRMan
1
注意:如果某些原因无法删除文件,则File.Delete(path);会抛出异常,我以前遇到过“未知错误“1346””。 - vapcguy

129

使用System.IO.File.Delete方法,如下所示:

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

根据文档说明:

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


11
如果“指定路径无效(例如,它位于未映射的驱动器上)”,则会引发 DirectoryNotFoundException 异常。 - Timothy Strimple
6
很奇怪,Intellisense 显示“如果指定的文件不存在,则会抛出异常”。 - fearofawhackplanet
1
也许你正在使用不同版本的.NET框架? - Chris Eberle
2
我正在使用.Net4,看起来智能感知是错误的。我已经运行了检查,没有抛出异常。 - fearofawhackplanet
5
是的,我尝试过,只需使用 System.IO.File.Delete(@"C:\test.txt"); 就足够了。谢谢。 - Berkay Turancı
1
注意:如果某些原因无法删除文件,则File.Delete(path);会抛出异常,我以前遇到过“未知错误“1346””。 - vapcguy

48
您可以使用以下方式导入System.IO命名空间:
using System.IO;

如果filepath表示文件的完整路径,您可以按照以下方式检查其是否存在并删除它:
if(File.Exists(filepath))
{
     try
    {
         File.Delete(filepath);
    } 
    catch(Exception ex)
    {
      //Do something
    } 
}  

4
为什么不直接发出删除调用,然后捕获任何指示文件不存在的异常? - antred
3
我想可能还会抛出更多的异常。 - Rev Tyler

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

但是

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

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


27

如果你想避免出现DirectoryNotFoundException错误,你需要确保该文件所在的目录确实存在。使用File.Exists可以做到这一点。另一种方法是利用PathDirectory实用类,如下所示:

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

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

15
if (File.Exists(path))
{
    File.Delete(path);
}

4
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.");    
}

4
如果你正在使用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");

1
或者使用 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);
            }
        }

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

14
所以您正在尝试每秒删除文件20次,直到它被删除。如果由于某种原因无法删除该文件,并且程序会一直尝试删除它怎么办?我不认为这是一个好的解决方案。 - kv1dr
5
至少应该提供一个超时参数。 - antred
1
@kv1dr 对的。我认为你应该尝试一下有限的时间,如果文件没有被删除就返回一个失败消息。 - QMaster

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接