c# – Vista中的UnauthorizedAccessException来自频繁的文件I / O和.Net 2.0

在工作中,我们已从
Windows XP迁移到
Windows Vista.迁移之后,我的一些单元测试,使用nUnit,开始随机抛出System.UnauthorizedAccessException失败.每个失败的测试都涉及将用于测试DLL中作为嵌入资源存储的测试的文件写入当前目录,运行测试,然后通常在setup / teardown或fixture setup / teardown中快速连续删除它们.我这样做是为了让我的测试与每个开发人员的驱动器上的位置无关,并且不会担心相对文件路径.

在对此进行故障排除时,我发现它与创建和删除文件有关.删除时,每次删除都遵循以下模式:

if( File.Exists(path) ) { File.Delete(path) }

当我用catch上的try-catch块和断点包围它时(如果抛出异常),该文件将已从磁盘中删除.对于文件创建失败,通常使用XmlWriter或StreamWriter,每个文件都指定覆盖文件(如果存在).

奇怪的是,在调查时,我创建了这个似乎重新创建异常的C#程序:

class Program
{
    static void Main(string[] args)
    {
        int i = 0;
        try
        {              
            while (true)
            {
                System.IO.TextWriter writer = new System.IO.StreamWriter("file.txt");
                i++;
                System.Console.Out.WriteLine(i);
                writer.Write(i);
                writer.Close();
                System.IO.File.Delete("file.txt");
            }
        }
        catch (System.UnauthorizedAccessException ex)
        {
            System.Console.Out.WriteLine("Boom at: " + i.ToString());
        }

    }
}

在我们的一台仍然有XP的机器上,它将继续迭代成几十万,直到我杀了它.在我们的任何Vista机器上,它将在150到500次迭代之间的任何地方打印“Boom”.

由于我无法访问工作之外的Vista机器,我无法确定这个特殊的“怪癖”是否是因为我的雇主的Vista或Vista本身的安全配置.

我只想说,我很难过.

编辑:

我要感谢大家的回应.我使用Christian建议的Process Monitor,发现Windows Vista SearchIndexer和TortoiseSVN的TSVNCache进程在我的代码运行时试图访问目标文件,正如Martin所建议的那样.

再次感谢.

最佳答案 你有病毒扫描仪吗?尝试禁用它们或使用ProcMon从
http://www.sysinternals.com观察文件活动

点赞