删除目录时出现奇怪的错误

时间:2012-12-13 07:52:50

标签: c# .net windows exception directory

Windows 7 x64 SP1 .NET Framework 3.5 SP1

我编写了简单的代码,但它在时间上有效,每隔一次传递就会发生异常。 ......即:它适用于偶数开始:2,4,6,8,e.t.c。但是奇怪的开始我得到例外:1,3,5,7,9,e.t.c。

// localMenuDirName is 'GPSM\AdminCAD'.
DirectoryInfo menuDir = new DirectoryInfo(Path.Combine(Environment.GetFolderPath(
    Environment.SpecialFolder.Programs), localMenuDirName));
if (menuDir.Exists) {
    FileInfo[] files = menuDir.GetFiles("*", SearchOption.AllDirectories);
    foreach (FileInfo file in files) {
        file.IsReadOnly = false;
    }
    sb.AppendLine(String.Format("We begin deleting the '{0}' directory", menuDir.FullName));

    Directory.Delete(menuDir.FullName, true); // Get Exception here

    // menuDir.Delete(true); // here I get same exception.

输出文字:

  

我们开始删除'C:\ Users \ andrey.bushman \ AppData \ Roaming \ Microsoft \ Windows \ Start   菜单\程序\ GPSM \ AdminCAD'目录

     

异常:目录不为空。

但目录为空(所有文件已被删除)。我打开资源管理器并查看它。

下一段代码总能正常工作:

// localMenuDirName is 'GPSM\AdminCAD'.
DirectoryInfo menuDir = new DirectoryInfo(Path.Combine(Environment.GetFolderPath(
    Environment.SpecialFolder.Programs), localMenuDirName));
if (menuDir.Exists) {
    FileInfo[] files = menuDir.GetFiles("*", SearchOption.AllDirectories);
    foreach (FileInfo file in files) {
        file.IsReadOnly = false;
    }
    sb.AppendLine(String.Format("We begin deleting the '{0}' directory", menuDir.FullName));

    try {
        Directory.Delete(menuDir.FullName, true); 
    }
    catch {
        // Try again... Now it works without exception!
        Directory.Delete(menuDir.FullName, true);
    }
    sb.AppendLine("Operation was executed successfully.");

为什么会这样?

1 个答案:

答案 0 :(得分:1)

Directory.Delete可能会因IOException而失败,因此有多种可能的选项。 根据{{​​3}}

  

存在由path指定的相同名称和位置的文件。

     

- 或者 - path指定的目录是只读的,或者递归为false而path不是空目录。

     

- 或 - 目录是应用程序的当前工作目录。

     

- 或 - 目录包含只读文件。

     

- 或 - 该目录正由另一个进程使用。目录或其中一个文件上有一个打开的句柄,操作系统是Windows XP或更早版本。这个打开句柄可以通过枚举目录和文件来实现。有关更多信息,请参见如何:枚举目录和文件。

换句话说:检查目录的开放处理程序,检查隐藏文件。