在工作中,我们已从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观察文件活动