C# Vista中使用.Net 2.0进行频繁文件I/O时出现的UnauthorizedAccessException
在工作中,我们已经从Windows XP迁移到Windows Vista。迁移之后,我的一些单元测试(使用nUnit)开始随机失败,并引发System.UnauthorizedAccessException。每个失败的测试都涉及将作为测试DLL中嵌入资源存储的测试所用的文件写入当前目录,运行测试,然后删除它们,通常是在安装/拆卸或夹具安装/拆卸过程中,快速连续地删除它们。我这样做是为了使我的测试对每个开发人员的驱动器上运行它们的位置不可知,而不用担心相对文件路径 在对此进行故障排除时,我发现它与文件的创建和删除有关。删除时,每次删除都遵循以下模式:C# Vista中使用.Net 2.0进行频繁文件I/O时出现的UnauthorizedAccessException,c#,vb.net,windows-vista,windows-xp,unauthorized,C#,Vb.net,Windows Vista,Windows Xp,Unauthorized,在工作中,我们已经从Windows XP迁移到Windows Vista。迁移之后,我的一些单元测试(使用nUnit)开始随机失败,并引发System.UnauthorizedAccessException。每个失败的测试都涉及将作为测试DLL中嵌入资源存储的测试所用的文件写入当前目录,运行测试,然后删除它们,通常是在安装/拆卸或夹具安装/拆卸过程中,快速连续地删除它们。我这样做是为了使我的测试对每个开发人员的驱动器上运行它们的位置不可知,而不用担心相对文件路径 在对此进行故障排除时,我发现它与
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进程在我的代码运行时试图访问目标文件,正如Martin建议的那样
再次感谢。你们有病毒扫描器吗?在vista中,尝试禁用它们或使用ProcMon查看文件活动,转到Performance Monitor(controlpanrl->Administrative tools),并在应用程序运行时观察其虚拟字节(内存泄漏)。Performance monitor为您提供了许多有关要调查的流程的详细信息。我怀疑您的应用程序没有释放资源,因为它在文件系统上大量工作
还可以使用performance monitor尝试查看可能导致您的问题的其他措施。如果我们不做什么调查,就很难责怪一家或另一家服务机构 它会不会偶尔与后台服务发生冲突,比如文件索引?尝试关闭尽可能多的这些服务