Directory.Delete进入IOException

时间:2015-08-05 07:13:31

标签: c#

我在C#中创建了一个shell脚本,用于删除服务器上的Windows主文件夹。主文件夹由文本文件给出。该脚本循环通过文件夹并删除它们。我有两个日志文件“成功”-log和“错误”-log。

删除部分如下:

if (Directory.Exists(serverShare + "\\" + user))
{
       try
       {
               Directory.Delete(serverShare + "\\" + user, true);
               successLog.WriteLine(serverShare + "\\" + user + " --- deleted");
       }
       catch (Exception ex)
       {
               errorLog.WriteLine(serverShare + "\\" + user + " --- Error: {0}", ex.ToString());
       }
}
else
{
      errorLog.WriteLine(serverShare + "\\" + user + " -- Errror: Directory not exists!");
}

现在我遇到了一个例外:

  

“System.IO.IOException:进程无法访问该文件,因为它   正在被另一个进程使用。 directory.delete图片   文档”。

该文件夹未被使用(访问该文件夹的用户不再在公司工作),因此没有其他进程可以访问该文件夹。

文件夹my documents\my musicmy documents\my pictures发生异常。那么它可以用特殊的Windows文件夹做点什么吗?

删除其他文件夹。所以脚本“有效”。在当地环境中也没有问题。

2 个答案:

答案 0 :(得分:0)

您可以手动删除文件夹吗?

您可以使用此Process explorer来获取锁定文件名。 https://technet.microsoft.com/en-sg/sysinternals/bb896653.aspx

或者你可以把

GC.Collect(); 
Directory.Delete(serverShare + "\\" + user, true);

答案 1 :(得分:0)

我已经解决了这个问题。某些(系统)文件夹具有Archive或ReadOnly标志。看来Directory.Delete(带有递归子文件夹删除)无法删除这些文件夹。所以你必须先删除这些属性。 删除mehtod:

    public static void ClearAttributes(string currentDir)
    {
        if (Directory.Exists(currentDir))
        {
            File.SetAttributes(currentDir, FileAttributes.Normal);

            string[] subDirs = Directory.GetDirectories(currentDir);
            foreach (string dir in subDirs)
            {
                ClearAttributes(dir);
            }

            string[] files = files = Directory.GetFiles(currentDir);
            foreach (string file in files)
            {
                File.SetAttributes(file, FileAttributes.Normal);
            }    
        }
    }

然后,在Directory.Delete运行此方法之前。

ClearAttributes(serverShare + "\\" + user);
Directory.Delete(serverShare + "\\" + user, true);

所以它工作正常,所有文件夹都被删除。