gpt4 book ai didi

c# - 使用 FileShare.Delete 会导致 UnauthorizedAccessException 吗?

转载 作者:太空狗 更新时间:2023-10-29 18:09:21 24 4
gpt4 key购买 nike

我正在使用以下代码打开我之前在用户的 %TEMP% 文件夹中创建的用于阅读的文件:

new FileStream(cacheFileName, FileMode.Open, FileAccess.Read, FileShare.Read | FileShare.Delete);

在某些用户的计算机上,这有时会引发 UnauthorizedAccessException 并显示消息“访问路径...被拒绝”。我无法重现这一点。我最初的猜测是反病毒或索引引擎正在做一些奇怪的事情,但我也注意到这段代码正在使用“FileShare.Delete”,我不确定它应该在那里。

是否存在使用“FileShare.Delete”导致 UnauthorizedAccessException 的情况?

最佳答案

是的,FileShare.Delete 往往会导致此问题。由在后台运行并扫描文件的任何程序使用,文件索引器和病毒扫描程序是常见的例子。

FileShare.Delete 允许另一个进程删除文件,即使后台进程仍然打开文件并从中读取文件。其他进程不会注意到该文件实际上并没有消失,因为它知道该文件实际上已被删除。

当其他进程依赖于实际被删除的文件并执行其他操作时,问题就开始了。通常通过创建具有相同名称的新文件来触发。值得注意的是一种非常不明智的文件保存方式,因为当保存失败时,如果没有备份,会导致数据完全丢失,但这种错误很常见。

这将失败,因为该文件的目录条目仍然存在,它不会消失,直到打开该文件的最后一个进程关闭句柄。任何其他尝试再次打开该文件的进程都将收到错误 5“访问被拒绝”。包括删除文件并尝试重新创建文件的进程。

解决方法是始终使用“事务性”保存,在尝试覆盖之前重命名文件。在 .NET 中可用 File.Replace(),在 native winapi 中可用 ReplaceFile()。手工也很容易完成,工作流程是:

  1. 删除备份文件,失败则停止
  2. 将旧文件重命名为备份文件名,失败则停止
  3. 使用原文件名写入新文件,如果失败则重命名备份
  4. 删除备份文件,忽略失败

第 2 步确保永远不会有任何数据丢失,如果出现任何问题,原始文件将保持完整。第 4 步确保 FileShare.Delete 将按预期工作,备份文件最终会在其他进程关闭其句柄时消失。

关于c# - 使用 FileShare.Delete 会导致 UnauthorizedAccessException 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19875329/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com