Directoy.Delete (путь, истина) -> IOException: каталог не пуст -> Различные владельцы на Win7 - PullRequest
3 голосов
/ 15 ноября 2011

При удалении я получаю IOException при попытке удалить каталог. «Каталог не пустой». Я пробовал разные методы, перечисленные ниже, но ничего не работает. Файлы, которые остались (и не могут быть удалены), имеют другого владельца. Файлы, которые можно удалить, имеют владельца «SYSTEM». Файлы, которые выдают исключение, имеют владельца «Администраторы (имя_компьютера \ Администраторы)». «Системные» файлы были записаны установщиком installshield (MSI), а остальные файлы - моим приложением, запущены с помощью installshield и повышены до уровня администратора ...

Как я могу принудительно удалить эту папку / файлы?

    ///307725/nevozmozhno-udalit-katalog-s-pomoschy-directory-delete-put-istina
    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);

1 Ответ

1 голос
/ 15 ноября 2011

Есть две распространенные опции, которые могут вызвать эту проблему:
1) Ваше приложение работает как пользователь без прав администратора.
2) Ваше приложение все еще каким-то образом блокирует созданные им файлы.

Первый вариант маловероятен, поскольку файлы были созданы им, поэтому давайте сосредоточимся на втором. Чтобы легко определить эту проблему, во время работы приложения (если процесс выполняется быстро, вы можете приостановить его с помощью отладчика), попробуйте удалить эти файлы вручную. Если вы потерпели неудачу, это означает, что приложение все еще имеет блокировку.

Если это так, убедитесь, что вы закрыли все файловые потоки и правильно удалили их.

...