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

时间:2016-09-20 12:18:23

标签: c# .net pdf microsoft-edge

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

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

// 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中打开文件,我们也会打印出“成功”。如果它在Adobe Reader中打开,则会抛出异常(正在使用文件)。

让我们创建一个新文件。 (出于演示目的,以.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)首先不应该失败吗?

注意:

  • 使用.Net Framework 4.5.1在Windows 10 Pro上测试

  • 文件资源管理器在文件资源管理器被代码删除后(在Edge中打开时)仍可在文件资源管理器中看到该文件。

  • 在按代码删除文件后关闭边缘浏览器时,文件从文件资源管理器中消失,我可以以编程方式创建新文件。

  • 仅在Edge中打开PDF时才会出现此问题。使用文本文件时,文本文件会被正确删除。

感谢任何澄清和帮助。

最佳克里斯

2 个答案:

答案 0 :(得分:0)

如果文件不存在,FileInfo.Delete()什么都不做。

来自msdn

<强> WinNt4Family

删除不会删除为普通I / O或内存映射文件打开的文件。

当路径是目录时,您会收到 UnauthorizedAccessException

答案 1 :(得分:0)

如果Edge在句柄上设置了FILE_SHARE_DELETE,则即使句柄存在,也可以通过另一个进程成功调用File.delete()。然后将该文件标记为删除,并在句柄关闭后删除。在那之前,它仍然可以在资源管理器中看到,但不再可访问。

有关更详细的说明,请参阅此SO帖子:

Odd behaviour when deleting Files with Files.delete()