在工作中,我们已从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所建议的那样。
再次感谢。
答案 0 :(得分:1)
在vista中,转到Performace Monitor(controlpanrl->管理工具)并观察应用程序运行时的虚拟字节(内存泄漏)。性能监视器为您提供有关要调查的过程的大量详细信息。我怀疑你的应用程序没有释放资源,因为它在文件系统上工作很大。
还可以使用性能监视器来尝试查看可能导致问题的其他措施。很难将一个或另一个服务归咎于进行少量调查。
答案 1 :(得分:1)
它是否偶尔会与后台服务冲突,例如文件索引?尝试尽可能多地关闭这些服务。
答案 2 :(得分:0)
你有病毒扫描程序吗?尝试禁用它们或使用http://www.sysinternals.com
中的ProcMon观察文件活动