13

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

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

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

问题是,删除方法工作正常,但要删除文件有几秒钟的时间。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 
{ ... }
4

8 回答 8

12

正如其他人指出的那样,该File.Delete方法将在失败的情况下抛出异常。

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

因此,您应该在删除文件之前检查文件是否存在;如果它不存在,你不应该做任何事情。如果它存在,你应该调用File.Delete,如果它抛出一个异常,那么你不应该做任何事情,因为文件没有被删除。否则,你应该做你的post-successful-deletion-of-existing-file。

于 2013-01-04T16:37:23.153 回答
2

Delete如果文件没有被删除,应该抛出异常。因此,您的电话Exists是多余的。

查看. _Delete

于 2013-01-04T16:12:17.683 回答
1

这是 Daniel A. White 的回答:我们可以看到该方法的签名public static void Delete(string path). 很明显,除非例外,否则您不会从 Delete 调用中获得反馈。但是让我们假设您有一个由另一个进程定期写入或更新的文件:

  1. 您的程序已成功删除该文件。
  2. 另一个进程在删除后立即重新创建它。
  3. 您的程序使用file.Exists. 有一个同名的新文件,因此返回 true。从技术上讲,您走错了路。

对于您当前尝试解决的问题,这种确切的情况可能不正确,但检查 Delete 调用是否引发异常比依赖当前实现更可靠。

于 2013-01-04T16:23:29.063 回答
0

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

于 2013-01-04T16:13:35.783 回答
0

您可以随时使用

 System.IO.File.Exists(path)

虽然我同意丹尼尔的观点,但如果删除不抛出异常,你应该很好。

于 2013-01-04T16:13:47.207 回答
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
}
于 2013-01-04T16:28:36.620 回答
0

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

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);
}
于 2015-04-05T21:24:58.027 回答
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";
}
于 2018-08-29T02:29:29.733 回答