如何检查System.IO.File.Delete是否已成功删除文件

时间:2013-01-04 16:10:39

标签: c# asp.net .net asp.net-mvc asp.net-mvc-4

使用system.io.file类删除文件后:

System.IO.File.Delete(openedPdfs.path);

如果文件被成功删除,我需要运行一些代码。 只要该方法没有返回任何值,我正在检查删除方法后文件是否存在。如果它仍然存在,我认为操作失败了。

问题是,删除方法工作正常,但要删除文件需要几秒钟。 Exist函数返回true,因为在检查文件时是否存在。

如何验证System.IO.File.Delete(openedPdfs.path);是否成功完成?

代码:

FileInfo file = new FileInfo(openedPdfs.path);    
System.IO.File.Delete(openedPdfs.path);
if (file.Exists == false)
{ ... }
else 
{ ... }

8 个答案:

答案 0 :(得分:12)

正如其他人所指出的那样,File.Delete方法会在出现故障时抛出异常。

他们忽略了指出的是,几乎所有情况都会抛出异常,但并非在所有情况下。具体来说,如果要删除的文件不存在,File.Delete方法将抛出异常。 (Duh?他们在想什么?)

因此,您应该检查文件是否存在之前以删除它;如果它不存在,你不应该做任何事情。如果存在,则应调用File.Delete,如果抛出异常,则再次执行任何操作,因为文件未被删除。否则,您应该成功删除现有文件。

答案 1 :(得分:3)

如果文件未被删除,

Delete应该抛出异常。因此,您对Exists的调用是多余的。

查看documentation for Delete

答案 2 :(得分:1)

这是Daniel A. White的回答:我们可以看到the signature for the methodpublic static void Delete(string path)。很明显,除了异常之外,你不会从Delete调用中获得反馈。但是,假设您有一个文件可以由另一个进程定期编写或更新:

  1. 您的程序成功删除了该文件。
  2. 其他进程在删除后立即重新创建。
  3. 您的程序使用file.Exists测试是否存在。有一个具有相同名称的新文件,因此返回true。你在技术上走错了路。
  4. 对于您当前尝试解决的问题,这种确切的情况可能并非如此,但检查Delete调用是否引发异常比依赖当前实现要强大得多。

答案 3 :(得分:0)

如果文件不存在,它不会抛出异常。如果出现错误,如果无法删除则会抛出异常,请检查File.Delete

答案 4 :(得分:0)

您可以随时使用

 System.IO.File.Exists(path)

虽然我同意丹尼尔的意见,但如果删除不会引发异常,那么你应该是好的。

答案 5 :(得分:0)

根据评论和建议,您应该能够使用以下内容来实现您想要的结果

try {
  FileInfo file = new FileInfo(openedPdfs.path);    
  System.IO.File.Delete(openedPdfs.path);
  // if no exception is thrown then you should assume all has gone well and put  
  // your file successfully deleted code here.
} catch /*(Specfic exceptions can be referenced here in separate catch blocks see Daniel A. White answer)*/ {
  // If something bad happened and the file was not deleted put handling code here
} finally {
  // if some action needs to be taken regardless of whether the file was successfully deleted or not put 
  // that code here
}

答案 6 :(得分:0)

我发现如果使用FileInfo Delete()实例方法,则不会更新FileInfo实例属性Exists。
例如,以下代码将抛出未找到文件的异常,因为该文件已被删除但第二个if (output_file.Exists)仍然计算为true。

FileInfo output_file;
if (output_file.Exists) output_file.Delete();   

FileStream fs;
if (output_file.Exists)
{
     fs = new FileStream(fi.FullName, FileMode.Open, FileAccess.ReadWrite);
}
else
{
     fs = new FileStream(fi.FullName, FileMode.CreateNew, FileAccess.ReadWrite);
}

我发现从旧版本创建一个新的FileInfo解决了这个问题:

FileInfo output_file;
if (output_file.Exists)
{
    output_file.Delete();
    output_file = new FileInfo(output_file.FullName);      
}

FileStream fs;
if (output_file.Exists)
{
     fs = new FileStream(fi.FullName, FileMode.Open, FileAccess.ReadWrite);
}
else
{
     fs = new FileStream(fi.FullName, FileMode.CreateNew, FileAccess.ReadWrite);
}

答案 7 :(得分:0)

private String del(String fileLocation) {

 if (File.Exists(@fileLocation)) {
  try {
   File.Delete(@fileLocation);
  } catch (Exception e) {
   return "File couldn't be deleted because: " + e.GetType().Name;
  }
 } else {
  return "File doesn't exist";
 }

 return "File successfully deleted";
}