【问题标题】:Directoy.Delete(path, true) -> IOException : the directory is not empty -> Different owners on Win7Directory.Delete(path, true) -> IOException : 目录不为空 -> Win7 上的不同所有者
【发布时间】:2011-11-15 12:39:39
【问题描述】:

卸载时,我在尝试删除目录时收到 IOException。 '目录不为空'。我尝试了下面列出的不同方法,但没有任何效果。 留下(且无法删除)的文件具有不同的所有者。 可以删除的文件的所有者为“SYSTEM”。引发异常的文件的所有者为“Administrators(PC_Name\Administrators)” “系统”文件由 installshield 安装程序 (MSI) 编写,而其他文件由我的应用程序编写,由 installshield 启动并提升为管理员...

如何强制删除此文件夹/文件?

    //http://stackoverflow.com/questions/329355/cannot-delete-directory-with-directory-deletepath-true
    public static bool DeleteDirectory(string target_dir)
    {
        bool result = false;

        string[] files = Directory.GetFiles(target_dir);
        string[] dirs = Directory.GetDirectories(target_dir);

        foreach (string file in files)
        {
            File.SetAttributes(file, FileAttributes.Normal);
            File.Delete(file);
        }

        foreach (string dir in dirs)
        {
            DeleteDirectory(dir);
        }

        Directory.Delete(target_dir, false);

        return result;
    }

    //http://stackoverflow.com/questions/611921/how-do-i-delete-a-directory-with-read-only-files-in-c
    private static void DeleteFileSystemInfo(FileSystemInfo fsi) 
    { 
        fsi.Attributes = FileAttributes.Normal; 
        var di = fsi as DirectoryInfo; 
        if (di != null) 
        { 
            foreach (var dirInfo in di.GetFileSystemInfos())             
                DeleteFileSystemInfo(dirInfo); } 

        fsi.Delete(); 
    }

    //http://stackoverflow.com/questions/611921/how-do-i-delete-a-directory-with-read-only-files-in-c
    public static void ForceDeleteDirectory(string path)
    {
        DirectoryInfo root;
        Stack<DirectoryInfo> fols;
        DirectoryInfo fol;
        fols = new Stack<DirectoryInfo>();
        root = new DirectoryInfo(path);
        fols.Push(root);
        while (fols.Count > 0)
        {
            fol = fols.Pop();
            fol.Attributes = fol.Attributes & ~(FileAttributes.Archive | FileAttributes.ReadOnly | FileAttributes.Hidden);
            foreach (DirectoryInfo d in fol.GetDirectories())
            {
                fols.Push(d);
            }
            foreach (FileInfo f in fol.GetFiles())
            {
                f.Attributes = f.Attributes & ~(FileAttributes.Archive | FileAttributes.ReadOnly | FileAttributes.Hidden);
                f.Delete();
            }
        }
        root.Delete(true);
    }

编辑:对不起,忘记了:

在出现问题的文件夹上,在安装时,我将完全控制“用户”帐户:

        System.Security.Principal.SecurityIdentifier sid = new System.Security.Principal.SecurityIdentifier(
            System.Security.Principal.WellKnownSidType.BuiltinUsersSid, null);
        System.Security.Principal.NTAccount acct = sid.Translate(typeof(System.Security.Principal.NTAccount))
            as System.Security.Principal.NTAccount;
        string usr = acct.ToString();

        DirectoryInfo info = new DirectoryInfo(dir);
        DirectorySecurity ds = info.GetAccessControl();

        ds.AddAccessRule(new FileSystemAccessRule(usr, FileSystemRights.FullControl, AccessControlType.Allow));
        ds.AddAccessRule(new FileSystemAccessRule(usr, FileSystemRights.FullControl,
            InheritanceFlags.ObjectInherit | InheritanceFlags.ContainerInherit, PropagationFlags.InheritOnly,
            AccessControlType.Allow));
        info.SetAccessControl(ds);

【问题讨论】:

  • 您在安装时是否对权限做了一些奇怪的事情?通常 SYSTEM 有权删除文件,但显然您的安装目录已关闭。
  • 据我所知没什么特别的......?可以删除的所有内容都由 installshield 安装。不能删除的文件是我在安装的时候自己写的.....即使我右击文件并选择'Security',两个SYSTEM as ADMINISTRATORS都有'Full Control' ??
  • 嗨,乔,抱歉忘了提及我在安装时授予文件夹特殊权限(请参阅问题)
  • 任何带有完整源代码示例的最终解决方案?

标签: c# .net filesystems system-administration


【解决方案1】:

有两个常见的选项可能会导致此问题:
1) 您的应用程序以非管理员用户身份运行。
2) 你的应用程序仍然以某种方式锁定由它创建的那些文件。

第一个选项是不可能的,因为文件是由它创建的,所以让我们以第二个为中心。 为了轻松识别此问题,在应用程序运行时(如果进程很快,您可以使用调试器暂停它),尝试手动删除这些文件。如果失败,则意味着应用程序仍有锁。

如果是这种情况,请确保关闭所有文件流并正确处理它们。

【讨论】:

  • 在显示卸载和错误消息时,我可以手动删除文件而不会出现问题。我还编写了一个简单的测试程序来使用 Directory.Delete 删除文件夹,并且它也可以正常工作...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-24
  • 2014-08-25
  • 2011-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多