- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
当读取 %LOCALAPPDATA%
中的文件时,同一台机器的同一用户会间歇性地发生此异常。
研究
我已经检查了该标题当前提供的所有可能重复项(有很多)。有一个与 reading an AES encrypted file 有关没有答案;我认为不适用,因为这些文件未加密。
其中大部分与写入文件有关(但我正在读取文件),或者是 MSDN 上为 File.ReadAllBytes(string) 记录的明显原因.
关于这个异常的三种解释是:
File.Exists
时进行的,所以我想我可以排除这种可能性。场景
当以域用户身份运行的应用程序正在读取同一用户的 %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...
}
间歇性证明
而且我可以从我们的错误日志和其他信息的组合中证明这在大部分时间都有效,并且我可以证明以下事件序列对于特定的机器组合和用户:
我认为文件系统不会发生任何重大更改(例如权限)以修复它。我想知道这是否可能是由边缘权限问题引起的,例如,如果他们的密码即将过期或最近已更改。
我有一个具体的例子,当我注意到这个错误发生时,我建议用户重新启动他们的机器,然后问题就消失了。
问题
谁能给我一个权威的解释,在我已经猜到的之上,或者确认这是什么原因?
最佳答案
这个问题太宽泛了,但我想指出,除了你列出的之外,还有其他原因导致拒绝访问异常。例如,考虑这个简单的程序:
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/
我在使用 NUnit 和 WatiN 运行任何测试时收到 UnauthorizedAccessException 错误: Test Test.IndexTests.Can_Do' failed: Wa
使用这段代码: DirectoryInfo info = new DirectoryInfo("\\s01\sharedfolder\folder"); FileInfo[] files = info
我正在创建一个应用程序来查找文件中的重复项。当我搜索文件时: try { string[] allFiles = Directory.GetFiles( directoryPa
我在指定位置创建一个目录,然后尝试使用 StreamWriter 访问它,但它一直显示“访问被拒绝。” 有人知道会发生什么吗? 我的代码是这样的: if (!Directory.Exists(
根据 MSDN,Directory.Exists如果目录不可访问,则应返回 false。我有一个 Directory.Exists 返回 true 但 Directory.GetFiles 抛出 Sy
我正在尝试遍历开始菜单上的项目,但我一直收到 UnauthorizedAccessException。我是目录的所有者,我的用户是管理员。 这是我的方法(它在一个 dll 项目中): // root
我有 ASP Web API,我正在尝试从那里的调用返回一个文件。 在我的服务器上,我不断收到错误: System.UnauthorizedAccessException: Access to the
我有一个简单的方法来计算目录和其中所有文件的大小。这是代码: using System; using System.IO; namespace MyProject.Libs { public
当我试图在 Registry.ClassesRoot 中创建一个子项时,我得到一个 System.UnauthorizedAccessException!我用的是win7。有谁知道为什么吗? 最佳答案
我正在 COM 端口上进行 C# 编码,我无法理解这个异常的含义,我试图在我的书和网上找到答案,但没有好消息。 所以我的问题是如何找到正确的异常名称的定义(我从网上复制了这段代码)。2. 这个前任是什
在读取或写入(创建文件)到随机文件夹时,我收到随机用户关于 UnauthorizedAccessException 的随机报告。通常放在自己的Documents文件夹中。而更多的问题是,当应用程序无法
我正在编写回归测试,需要手动将文件从一个位置移动到另一个位置。每次发生 UnauthorizedAccessException 时,我假设这与必须从中移动文件的文件夹的权限有关?我检查了文件属性,它没
我在尝试打开互斥量时遇到此异常(它只是有时发生;大多数调用都是成功的): System.UnauthorizedAccessException: Access to the path 'Global\
我有一个应用程序正在通过一些文件查找旧数据。为了确保我们不会破坏好的项目,我将文件复制到一个临时位置。我检查的一些目录是源代码目录,它们有 .svn 文件夹。我们使用 Subversion 来管理我们
偶尔,我的一些集成测试会因上述消息而失败。我正在使用下面的代码来准备端口。 for(int i = 0; i < 5; i++) {
我正在尝试通过这种方式从文件夹中获取所有文件: try { string[] files = Directory.GetFiles(folderBrowserDialog1.SelectedP
这个问题在这里已经有了答案: DeleteSubKey UnauthorizedAccessException (1 个回答) 关闭 5 年前。 我有一个 C# 应用程序,我正在尝试通过注册表编辑服
我正在尝试编写一个快应用来修改一些注册表项。当我通过 RegEdit 浏览时,我可以毫无问题地修改和删除 key 。 但是当我尝试使用 RegistryKey.DeleteSubKey() 时,它会抛
我正在研究如何将 Windows 上下文菜单中的快捷方式 添加到我的应用程序。我遇到了this文章,我试过了。这是它用于在注册表中创建 key 的代码。 private void btnAddMenu
在我拥有的 Windows 应用程序中,我在注册表中进行了一些更改,例如删除特定键,在某些测试场景中,例如在安装了 UAC 的 Vista 机器中,我得到了 System.UnauthorizedAc
我是一名优秀的程序员,十分优秀!