我有一个奇怪的情况,在Windows Server 2008上快速连续删除和创建目录导致偶尔出现一些奇怪的错误。有时我得到IOExceptions,有一次我有一个NotAuthorizedException。奇怪的情况删除和创建目录
这是我的代码,但是当在调试器中加入时,很多异常都会被抛出。实际上,我在执行directory.delete的同时刚刚发生IOException异常,'目录不为空'!
更新 不少的答复谈论非原子目录的创建和延迟写入等是否有使这项工作的100%保证呢?理想情况下,我想要一些系统调用,即'DeleteDirectoryAndWaitForTheDirectoryToBeDeleted'和相应的系统调用,即'CreateDirectoryAndWaitForTheDirectoryToBeCreated'。
另一个更新 我把尼尔的代码的下方,试了一下我的机器上,并很快失败(经过20圈)。看来正在发生的事情是IDriveE服务可以访问该目录,并且尝试创建该目录失败并显示DELETE PENDING。我想我需要做更多的研究,比如DELETE PENDING。
就我个人而言,我不喜欢这个代码,因为它“闻起来”错了 - 但它的工作原理。
Console.WriteLine("CleanAndCreateDirectory: {0}", baseDirectory);
while (Directory.Exists(baseDirectory))
{
Console.WriteLine("DeleteDirectory: {0}", baseDirectory);
try
{
Directory.Delete(baseDirectory, true);
}
catch (Exception ex)
{
Console.Error.WriteLine(ex.Message);
Thread.Sleep(1000);
}
}
while (!Directory.Exists(baseDirectory))
{
try
{
Directory.CreateDirectory(baseDirectory);
}
catch (Exception ex)
{
Console.Error.WriteLine(ex.Message);
}
}
我的怀疑是看文件系统,导致某些操作延迟,但我不知道是什么。
尝试检查谁具有您要删除的目录的句柄。 Sysinterals有几个工具可能会有所帮助 - Process Explorer,FileMon,Handle等。知道哪个进程持有打开的句柄可以为您节省大量时间查找失败的原因。 – eran 2009-04-19 10:44:38
说起来容易做起来难。它发生的时间是随机的,所以我可以得到一些大的日志文件。无论如何,我会继续努力 - 谢谢! – 2009-04-19 19:06:17