【问题标题】:Replacing PDF fails. Even with File.Delete() success when opened in Edge-Browser替换 PDF 失败。即使在 Edge-Browser 中打开 File.Delete() 成功
【发布时间】:2016-09-20 12:18:22
【问题描述】:

目标是替换当前保存在磁盘上的 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 中打开,我们也会打印出“成功”。如果在 Adob​​e 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 时才会出现此问题。当使用文本文件时,文本文件会被正确删除。

感谢任何澄清和帮助。

最好的克里斯

【问题讨论】:

  • 您的成功消息在 try/catch 块之外。因此它总是说成功。将它放在 try 块的末尾。
  • 不正确,因为如果我们失败了,我会回来。我正在编辑代码。
  • 我测试了删除一个在edge中打开的pdf文件,实际上File.Delete方法不会抛出异常。但是删除文件后,如果我尝试重新加载它,边缘说它找不到文件并且它被删除了。
  • 可能与权限有关,尝试做 info.IsReadOnly = false;在存在 if 子句之前
  • 我上面描述的行为相同。我很好奇为什么删除没有失败。如果文件在保持锁定状态的软件中打开,通常会发生这种情况。由于 Edge 似乎没有,为什么我不允许/能够重写文件?我需要在 File.Delete 调用之后重新检查 File.Exists 是否存在,以确保它现在没有在 Edge 中打开。如果它是只读的(不是,只是检查),为什么允许我删除它?

标签: c# .net pdf microsoft-edge


【解决方案1】:

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

来自msdn

WinNt4Family

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

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

【讨论】:

  • 我确实检查了该文件是否存在。 “如果(信息。存在){ ... }”。在 Win10 上测试过(不是 Nt4Family 对吗?)
【解决方案2】:

如果 FILE_SHARE_DELETE 由 Edge 设置在句柄上,那么即使句柄存在,另一个进程也可以成功调用 File.delete()。然后将文件标记为删除,并在句柄关闭后删除。在此之前,它仍然在 Explorer 中可见,但不再可访问。

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

Odd behaviour when deleting Files with Files.delete()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-13
    • 2022-01-24
    • 2022-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多