Vista中的UnauthorizedAccessException来自频繁的.Net 2.0文件I / O.

时间:2009-05-04 21:52:39

标签: c# vb.net windows-vista windows-xp unauthorized

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

再次感谢。

3 个答案:

答案 0 :(得分:1)

在vista中,转到Performace Monitor(controlpanrl->管理工具)并观察应用程序运行时的虚拟字节(内存泄漏)。性能监视器为您提供有关要调查的过程的大量详细信息。我怀疑你的应用程序没有释放资源,因为它在文件系统上工作很大。

还可以使用性能监视器来尝试查看可能导致问题的其他措施。很难将一个或另一个服务归咎于进行少量调查。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

你有病毒扫描程序吗?尝试禁用它们或使用http://www.sysinternals.com

中的ProcMon观察文件活动