При удалении я получаю 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);