目标是替换当前保存在磁盘上的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时才会出现此问题。使用文本文件时,文本文件会被正确删除。
感谢任何澄清和帮助。
最佳克里斯
答案 0 :(得分:0)
如果文件不存在,FileInfo.Delete()
什么都不做。
来自msdn
<强> WinNt4Family 强>
删除不会删除为普通I / O或内存映射文件打开的文件。
当路径是目录时,您会收到 UnauthorizedAccessException 。
答案 1 :(得分:0)
如果Edge在句柄上设置了FILE_SHARE_DELETE,则即使句柄存在,也可以通过另一个进程成功调用File.delete()。然后将该文件标记为删除,并在句柄关闭后删除。在那之前,它仍然可以在资源管理器中看到,但不再可访问。
有关更详细的说明,请参阅此SO帖子: