gpt4 book ai didi

c# - LOCALAPPDATA 中 File.ReadAllBytes 的 UnauthorizedAccessException "Access to the path is denied"

转载 作者:可可西里 更新时间:2023-11-01 13:27:16 25 4
gpt4 key购买 nike

当读取 %LOCALAPPDATA% 中的文件时,同一台机器的同一用户会间歇性地发生此异常。

研究

我已经检查了该标题当前提供的所有可能重复项(有很多)。有一个与 reading an AES encrypted file 有关没有答案;我认为不适用,因为这些文件未加密。

其中大部分与写入文件有关(但我正在读取文件),或者是 MSDN 上为 File.ReadAllBytes(string) 记录的明显原因.

关于这个异常的三种解释是:

  1. “当前平台不支持此操作”——我不知道那是什么意思;但鉴于这有时适用于同一台机器上的同一用户(我将在下面解释),我想我可以排除这种可能性。
  2. path specified a directory”——正如您将从下面的代码中看到的,调用是在检查 File.Exists 时进行的,所以我想我可以排除这种可能性。
  3. “调用者没有所需的权限。”这是对此异常的通常解释,我怀疑我遇到了某种“边缘案例”。

场景

当以域用户身份运行的应用程序正在读取同一用户的 %LOCALAPPDATA% 子文件夹内的文件时(该用户不应该有任何权限问题),就会发生这种情况读取文件)。其中的子文件夹仅遵循正常的“CompanyName”\“ApplicationName”结构,并且没有对子文件夹应用额外的权限(我们只是使用该文件夹来让我们的文件远离其他人)。

异常

System.UnauthorizedAccessException: Access to the path '[redacted]' is denied. at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath, Boolean checkHost) at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options, String msgPath, Boolean bFromProxy, Boolean useLongPath, Boolean checkHost) at System.IO.File.InternalReadAllBytes(String path, Boolean checkHost)
at the code below

代码

        // Note that filename is within %LOCALAPPDATA%
if (File.Exists(fileName))
{
var readAllBytes = File.ReadAllBytes(fileName); // exception here
// etc...
}

间歇性证明

而且我可以从我们的错误日志和其他信息的组合中证明这在大部分时间都有效,并且我可以证明以下事件序列对于特定的机器组合和用户:

  • 应用程序运行,然后
  • 此异常发生(可能发生多次,每次重试延迟呈指数增长:1 分钟、2 分钟、4 分钟等),然后
  • 应用程序再次运行

我认为文件系统不会发生任何重大更改(例如权限)以修复它。我想知道这是否可能是由边缘权限问题引起的,例如,如果他们的密码即将过期或最近已更改。

我有一个具体的例子,当我注意到这个错误发生时,我建议用户重新启动他们的机器,然后问题就消失了。

问题

谁能给我一个权威的解释,在我已经猜到的之上,或者确认这是什么原因?

最佳答案

这个问题太宽泛了,但我想指出,除了你列出的之外,还有其他原因导致拒绝访问异常。例如,考虑这个简单的程序:

public class Program {
static string _target = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "test", "test.txt");
static void Main(string[] args) {
File.Create(_target).Dispose();
ProcessFile();

// below throws access denied
if (File.Exists(_target))
Console.WriteLine(File.ReadAllText(_target));
Console.ReadKey();
}

static void ProcessFile() {
// open and abandon handle
var fs = new FileStream(_target, FileMode.Open, FileAccess.Read, FileShare.Delete);
// delete
File.Delete(_target);
}
}

这里我们在 %LOCALAPPDATA% 下创建新文件,并使用 FileShare.Delete 打开它,但没有关闭。 FileShare.Delete 允许随后删除文件,但在关闭文件的所有句柄之前不会真正删除文件。

然后我们继续 File.Delete,它实际上并没有删除文件,而是将其标记为删除,因为我们仍然有打开的文件句柄。

现在,File.Exists 为此类文件返回 true,但如您所述,尝试访问它会抛出“拒绝访问”异常。

这种具体情况是否与您的案例相关很难说,但可能是。

我的观点主要是:您应该预料到此类异常(以及“文件已在使用”类异常)并通过重试来处理它们。它们可能由于您无法控制的各种原因而发生。

关于c# - LOCALAPPDATA 中 File.ReadAllBytes 的 UnauthorizedAccessException "Access to the path is denied",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50058630/

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