在工作中,我们已经从Windows XP迁移到Windows Vista。迁移之后,我的一些使用nUnit的单元测试开始随机失败,并抛出System.UnauthorizedAccessException。每个失败的测试都涉及将用于测试的文件作为测试DLL中的嵌入式资源写入当前目录,运行测试,然后快速连续地删除它们,通常是在setup/teardown或fixture setup/teardown中。我这样做是为了让我的测试与运行它们的每个开发人员驱动器上的位置无关,也不用担心相对文件路径。
在排除故障时,我发现它与文件的创建和删除有关。在删除时,每次删除都遵循以下模式:
if( File.Exists(path) ) { File.Delete(path) }当我用try-catch块和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进程在我的代码运行时试图访问目标文件。
再次感谢。
发布于 2009-05-04 23:29:43
你们有病毒扫描仪吗?尝试禁用它们或使用http://www.sysinternals.com中的ProcMon查看文件活动
发布于 2009-05-05 06:55:03
在vista中,转到Performace Monitor (控制面板->管理工具),观察应用程序运行时的虚拟字节(内存泄漏)。性能监视器为您提供了许多有关您要调查的进程的详细信息。我怀疑您的应用程序没有释放资源,因为它在文件系统上进行了大量工作。
也可以尝试使用性能监视器,尝试查看可能导致问题的其他措施。如果不做很少的调查,就很难责怪一个或另一个服务。
发布于 2009-05-05 07:10:46
它会不会偶尔与后台服务发生冲突,比如文件索引?尝试尽可能多地关闭这些服务。
https://stackoverflow.com/questions/822262
复制相似问题