更换PDF失败.即使在Edge-Browser中打开File.Delete()成功

本文关键字:File Delete 成功 失败 PDF Edge-Browser 更换 | 更新日期: 2023-09-27 18:07:47

目标是替换当前保存在磁盘上的pdf文件。

我正在从磁盘中删除当前的PDF文件,然后重新创建一个新的。除非PDF当前是在Microsoft Edge浏览器中打开的,否则工作正常。

// Try delete PDF-File (which is opened in Edge Browser)
var info = new FileInfo(pathToPdf);
if (info.Exists)
{
    try
    {
        info.Delete();
        // Same thing with the File.Delete call
        //File.Delete(path);
        Console.WriteLine("Success.");
    }
    catch (Exception)
    {
        Console.WriteLine("Failed.");
        return;
    }        
}

即使在Edge中打开文件,我们也会得到"Success"打印输出。如果在adobereader中打开它,它将抛出一个异常(文件在使用中)。

我们创建一个新文件。(为了演示,以。pdf结尾的文本文件)

try
{
    using (var writer = File.CreateText(pathToPdf))
    {
        writer.Write("Foo");
        writer.Flush();
        Console.WriteLine("Success.");
    }
}
catch (Exception e)
{
    Console.WriteLine("Failed.");
    return;
}    

我希望能够创建一个新文件,因为Delete()没有失败。然而,我得到一个UnauthorizedAccessException:"对路径'XYZ'的访问被拒绝。"

作为一种变通方法,我可以在删除文件后重新检查该文件是否存在。

var newInfo = new FileInfo(pathToPdf);
if (newInfo.Exists)
    // Delete failed

但是我为什么要这样做呢?FileInfo.Delete()或File.Delete(path)不应该首先失败吗?

指出:

  • 在Windows 10 Pro和。net Framework 4.5.1上测试

  • 文件被代码删除后(在Edge中打开时)在文件资源管理器中仍然可以看到其原始文件大小。

  • 当通过代码删除文件后关闭边缘浏览器时,文件从文件资源管理器中消失,我可以通过编程创建一个新文件。

  • 此问题仅在Edge中打开pdf时发生。当使用文本文件代替文本文件被正确删除

任何澄清和帮助都是感激的。

最好的克里斯。

更换PDF失败.即使在Edge-Browser中打开File.Delete()成功

如果文件不存在,FileInfo.Delete()不做任何操作。

从msdn

WinNt4Family

Delete不删除为正常I/O打开的文件或内存映射的文件。

当路径是一个目录时,你会得到一个UnauthorizedAccessException

如果Edge在句柄上设置了FILE_SHARE_DELETE,则即使该句柄存在,其他进程也可以成功调用File.delete()。然后该文件被标记为删除,并在句柄关闭后被删除。在此之前,它在资源管理器中仍然可见,但无法访问。

要获得更详细的解释,请参阅这篇文章:

使用Files.delete()删除文件时的异常行为