在工作中,我们已经从Windows XP迁移到Windows Vista。迁移之后,使用nUnit的一些单元测试开始随机失败,并引发System.UnauthorizedAccessException。每个失败的测试都涉及将用于存储为测试DLL中嵌入资源的测试的文件写入当前目录,运行测试,然后快速连续地删除它们,通常在设置/拆卸或夹具设置/拆卸过程中。我这样做是为了让我的测试对每个开发人员驱动器上的位置都不知道,因为他们是从哪个位置运行的,而不用担心相关的文件路径。Vista中来自频繁文件I/O和.Net 2.0的UnauthorizedAccessException
在对此进行故障诊断时,我发现它与创建和删除文件有关。在删除,删除每个下面的模式:
if(File.Exists(path)) { File.Delete(path) }
当我围绕这个用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建议的进程监视器,发现Windows Vista SearchIndexer和TortoiseSVN的TSVNCache进程试图在我的代码运行时访问目标文件,正如Martin所建议的。
再次感谢。