2009-05-04 46 views
4

在工作中,我们已经从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所建议的。

再次感谢。

回答

1

观看讨论procmon文件活动在Vista中,去服务表现监视器(controlpanrl->管理工具),并观察虚拟字节(内存泄漏)为您的应用程序在运行时。性能监视器为您提供了大量关于您想要调查的进程的详细信息。我怀疑你的应用程序没有释放资源,因为它在文件系统上工作很多。

还可以使用性能监视器来尝试查看可能导致问题的其他措施。很难指责一个或另一个服务而没有做一点调查。

1

它可能偶尔与后台服务冲突,如文件索引?尽可能多地尝试关闭尽可能多的这些服务。