File.Delete无声地失败 - 如何调试?

时间:2014-02-20 19:31:18

标签: c# .net

以下代码无法删除文件并打印file delete:,因此我知道该文件存在。打开我的应用程序后,我可以删除文件资源管理器中的文件。

我该如何调试?

1)文件权限?我的应用创建了文件,所以应该可以删除?无论它会抛出异常并点击我的catch调试消息。

2)文件存在!根据文件,除了不存在之外的任何其他失败都应该在我的捕获中抓住......

if (File.Exists(fn))
{
     Debug.WriteLine("file delete: " + fn);
     try
     {
         File.Delete(fn);
     }
     catch
     {
         Debug.WriteLine("Could not delete: " + fn);
     }
} else {
     Debug.WriteLine("File doesn't exist: "+fn);
}

如果这很重要,则使用以下代码从RichTextBox保存文件。

TextRange range;
FileStream fStream;
range = new TextRange(mNotepad.Document.ContentStart, mNotepad.Document.ContentEnd);
fStream = new FileStream(fn, FileMode.Create);
range.Save(fStream, DataFormats.XamlPackage);
fStream.Close();

4 个答案:

答案 0 :(得分:6)

删除文件可以保证文件实际上将从文件系统中删除。该文件可能已被另一个进程打开,该进程明确指定了删除共享。与读写共享非常相似。也可以在.NET中使用,您可以将FileShare.Delete传递给FileStream构造函数。

但是,在所有进程关闭文件之前,当然不能删除物理文件。所以它超出了File.Delete()调用,也可以通过File.Exists()看到。打开文件不再有效,拒绝访问将被拒绝。否则是从不使用File.Exists()的一个很好的理由,它有很多问题。

如果您想知道其他进程打开了哪个进程,那么您可以使用SysInternals的Handle或Process Explorer之类的实用程序。期待找回像病毒扫描程序或搜索索引器这样的程序,但可能是任何东西。像.NET程序一样:))

答案 1 :(得分:1)

来自MSDN:

  

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

确保您的路径存在。我知道你说过你,但再次检查。

确保您达到实际的File.Delete

干杯

答案 2 :(得分:0)

之前我遇到过同样的问题,请按照步骤查看它是否对您有所帮助。听起来很傻。确保除您之外的任何进程都没有使用您创建的文件?这个应用程序是多线程的吗?你有运行使用该文件的服务吗?

  1. 确保您未处于调试模式,并执行Build - Clean

  2. 检查文件是否仍在该位置并复制文件路径。

  3. 在删除文件之前设置一个断点。

  4. 在您放置break-point

  5. 后重建项目
  6. F5进行调试并逐步执行代码。

  7. 检查文件路径是否与您拥有的文件路径匹配。

答案 3 :(得分:0)

我试图用我自己的代码重现类似的情况

string fn = @"C:\Users\Public\Pictures\Sample Pictures\Desert - Copy.jpg";
//The file is locked by Image.FromFile
Image img = Image.FromFile(fn);
//If img.Dispose() here, then file is unlocked and can be deleted
if (File.Exists(fn))
{
    try
    {

        File.Delete(fn);
        Debug.WriteLine("file delete: " + fn);
    }
    catch
    {
        //Caught
        Debug.WriteLine("Could not delete: " + fn);
    }
}
else
{
    Debug.WriteLine("File doesn't exist: " + fn);
}

我发现该文件被Image.FromFile() 锁定,因此无法删除。 出于同样的原因,我相信您的文件路径fn被Filestream ftream

锁定

你可以尝试吗

fStream.Dispose();
在删除过程之前

并重新运行程序以查看是否可以删除该文件?谢谢。如果需要,你可以处理fstream并创建一个新的,对吗?