【问题标题】:Eventual System.UnauthorizedAccessException: Access to the path ... denied最终 System.UnauthorizedAccessException:访问路径...被拒绝
【发布时间】:2012-04-24 13:11:12
【问题描述】:

我有一个简单的 C# 控制台程序,它调用如下所示的函数:

static void DirTest()
{
    string dir = "Temp";
    for (int i = 0; i < int.MaxValue; i++)
    {
        if (!Directory.Exists(dir))
        {
            Directory.CreateDirectory(dir);
        }
        string file = Path.Combine(dir, "sample.txt");
        File.Create(file).Close();
        File.Delete(file);
        Directory.Delete(dir);
    }
}

在某些 Win 7 机器上,这个函数最终会抛出异常(当 i 超过 100,000 时):

未处理的异常:System.UnauthorizedAccessException:对路径“D:\...\Temp\sample.txt”的访问被拒绝。 在 System.IO.__Error.WinIOError(Int32 错误代码,字符串可能全路径) at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBU TES secAttrs、字符串 msgPath、布尔 bFromProxy) 在 System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare sh 是,Int32 bufferSize,FileOptions 选项) 在 System.IO.File.Create(字符串路径) 在 D:\Exceptions\Program.cs:line 118 中的 Exceptions.Program.DirTest() 在 D:\Exceptions\Program.cs 中的 Exceptions.Program.Main(String[] args): 第 167 行

这些机器安装了 McAfee 代理和 Cisco 安全代理以及许多其他软件。 Windows Defender 被禁用。该程序正在管理员控制台中运行。该程序是为 .net 3.5 编译的。这是我在 W2k3 或 XP 机器上没有看到的。

如果我使用 procmon 监视所有访问创建和删除“Temp\sample.txt”文件夹的事件和进程,我会看到除了测试应用程序之外没有其他进程正在访问该路径。即使出现异常,procmon 中也没有列出其他进程。所以我无法证明是杀毒软件的错。

有没有人知道可能出了什么问题? 我是否在 Win7 上发现了 .net 中的错误;)

谢谢!

【问题讨论】:

  • 你为什么要这样做?
  • 这很可能是底层磁盘驱动程序或 NTFS 本身的问题,与 .NET 无关。以超过 100,000 倍的速度创建和删除目录和文件对于操作系统、磁盘或程序来说不太可能是健康的。正如@hamad 所说,你的用户名也要求它,为什么为什么为什么?
  • 我的钱花在了用户帐户控制 (UAC) 上,这是这里的问题。您是否尝试过将您的 prog 提升为管理员权限?
  • 可能你正在寻找这个:stackoverflow.com/questions/8821410/…>
  • hamad, yamen - 我写这个测试的原因是我在一个 24/7 做类似事情的软件上工作,虽然不是在同一个文件夹上,而是在巨大的文件共享上。

标签: c# .net-3.5 disk-io


【解决方案1】:

代码在我的机器上运行 Windows 7 / 64 位

我猜你的“反病毒”程序是检查每个创建文件的问题。

我让 McAffee 运行,但没有 Cisco..

希望这个答案能有所帮助;)

【讨论】:

  • 如果我使用 procmon 监视所有访问创建和删除“Temp\sample.txt”文件夹的事件和进程,我看到除了测试应用程序之外没有其他进程正在访问路径。即使出现异常,procmon 中也没有列出其他进程。所以我不能证明是杀毒的错。
【解决方案2】:

@whywhywhy

我稍微修改了您的代码,看看我是否可以获得更多信息,如果它最终会出错。

static void DirTest()
{
    string dir = "Temp";
    int i = 0;
    try
    {
        for (i = 0; i < int.MaxValue; i++)
        {
            if (!Directory.Exists(dir))
            {
                Directory.CreateDirectory(dir);
            }
            string file = Path.Combine(dir, "sample.txt");
            File.Create(file).Close();
            File.Delete(file);
            Directory.Delete(dir);
            System.Console.WriteLine("Finished i: " + i);
        }
    }
    catch
    {
        System.Console.WriteLine("Error on i: " + i);
        throw;
    }
}

我完成了 200,000 次迭代,没有出现任何问题。我什至将循环中的写行注释掉了,这将使它执行得更快,仍然没有问题。

我不确定您使用的是哪个版本的 Visual Studio,但是您可能想尝试以下方法: 1) 检查 VS 和 windows 的更新。 2) 检查您的硬盘驱动器的驱动程序更新。

也许您也可以使用 print 语句运行修改后的代码……看看是否是时间问题。 print 语句可能足以让事情顺利进行。如果是这样的话,那我的猜测应该和衙门一样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-19
    • 2015-02-28
    • 2017-01-24
    • 1970-01-01
    • 1970-01-01
    • 2021-04-02
    相关资源
    最近更新 更多