【发布时间】: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 中打开,我们也会打印出“成功”。如果在 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 时才会出现此问题。当使用文本文件时,文本文件会被正确删除。
感谢任何澄清和帮助。
最好的克里斯
【问题讨论】:
-
您的成功消息在 try/catch 块之外。因此它总是说成功。将它放在 try 块的末尾。
-
不正确,因为如果我们失败了,我会回来。我正在编辑代码。
-
我测试了删除一个在edge中打开的pdf文件,实际上
File.Delete方法不会抛出异常。但是删除文件后,如果我尝试重新加载它,边缘说它找不到文件并且它被删除了。 -
可能与权限有关,尝试做 info.IsReadOnly = false;在存在 if 子句之前
-
我上面描述的行为相同。我很好奇为什么删除没有失败。如果文件在保持锁定状态的软件中打开,通常会发生这种情况。由于 Edge 似乎没有,为什么我不允许/能够重写文件?我需要在 File.Delete 调用之后重新检查 File.Exists 是否存在,以确保它现在没有在 Edge 中打开。如果它是只读的(不是,只是检查),为什么允许我删除它?
标签: c# .net pdf microsoft-edge