1

我有一个简单的 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 中发现了一个错误;)

谢谢!

4

2 回答 2

1

@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 次迭代,没有出现任何问题。我什至在循环中注释掉了 writeline,这将使它执行得更快,仍然没有问题。

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

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

于 2012-05-18T23:18:20.030 回答
1

代码适用于我的 Maschine Windows 7 / 64 位

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

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

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

于 2012-04-12T08:36:38.457 回答