.net 在%temp%中读取文件时发生随机UnauthorizedAccessException

.net 在%temp%中读取文件时发生随机UnauthorizedAccessException,.net,exception,.net,Exception,我有一个在临时目录中写入文件的进程。写入文件时没有共享读取权限,因此,如果有人试图在写入文件时读取此文件,则会抛出IOException,这很好 在一些罕见的情况下,我在尝试读取此文件时似乎遇到了未经授权的DaccessException。我相当肯定(从日志中)该文件没有被写入,但我看不到任何其他我无法访问它的原因 此外,该进程从Visual Studio扩展运行,这意味着它与父进程(Visual Studio本身)具有相同的权限 以下是我尝试打开文件的方式: new FileStream(ca

我有一个在临时目录中写入文件的进程。写入文件时没有共享读取权限,因此,如果有人试图在写入文件时读取此文件,则会抛出
IOException
,这很好

在一些罕见的情况下,我在尝试读取此文件时似乎遇到了
未经授权的DaccessException
。我相当肯定(从日志中)该文件没有被写入,但我看不到任何其他我无法访问它的原因

此外,该进程从Visual Studio扩展运行,这意味着它与父进程(Visual Studio本身)具有相同的权限

以下是我尝试打开文件的方式:

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

有时,此行会抛出一个
UnauthorizedAccessException
。你知道为什么吗?

我个人会对你的文件运行带有过滤器的ProcMon,看看是否有其他东西访问该文件并妨碍了你的代码。

这绝对不是共享问题,它会生成共享冲突错误,并且会报告IOException

对于UnauthorizedAccessException,只有两种合理的解释。一个是逻辑文件,该文件是使用自定义ACL创建的,该ACL只是拒绝访问。在这种情况下,您需要了解更多有关创建文件的过程的信息,并对其进行重击,使其停止执行此操作。控制该进程使用的用户帐户可能很重要

第二种解释与许多进程在TEMP目录中创建文件和目录的奇特性有关。在那里创建的文件是事务性的,并且允许系统生成文件名,从而确保不会发生名称冲突,这一点非常重要。让一个进程创建一个文件并允许另一个进程打开它是自找麻烦。当临时目录包含与您试图打开的文件同名的目录时,您将获得UnauthorizedAccessException


如果这种情况不经常发生,并且文件又很快消失,则调试此问题很棘手。您可以记录打开文件时失败的尝试。

谢谢,但这不会发生在我的机器上,而是发生在几个用户的机器上。我得到的只是日志。也许如果我们能捕捉到它的“live”,那么我可以要求用户运行ProcMon…在您的异常中使用它,也许?并将其保存到日志中。此外,您可以尝试其中的一些方法,也许可以在读写模式下打开它,拒绝访问。或者你有另一个自己的线程访问它,让自己成为拥有该文件的人?也许病毒扫描程序正在访问该文件?也许,但同样,阿联酋?我想这只是个例外。可以添加异常堆栈跟踪吗?