Erro "Diretório não está vazio" ao tentar excluir programaticamente uma pasta
No meu aplicativo, eu construí um sistema onde os usuários podem criar galerias de fotos. Fotos mantidas em pastas no formato category_name / gallery_name / {pictures} no disco. Cada foto enviada é armazenada sob a estrutura de diretórios relevante, conforme indicado acima.
Ao tentar excluir uma categoria, além de excluir do banco de dados, também quero excluir pastas relevantes do sistema. Quando recebi pela primeira vez a mensagem de erro "O diretório não está vazio" Iprocurou e encontrou esta solução:
public static void DeleteDirectory(string target_dir)
{
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);
}
Com esta solução, as fotos na pasta "gallery_name" são excluídas muito bem, então a pasta gallery_name em si é excluída como multa .. então ficamos com uma pasta vazia category_name. Então o último pedaço de código na sub-rotina acima (Directory.Delete(target_dir, false);
) é chamado para excluir a pasta category_name. O erro aumenta novamente ..
Alguém sabe uma solução para isso?
Directory.Delete(target_dir, true);
não funcionou, por isso tentei uma alternativa.Eu tenho controle total sobre a pasta pai e as pastas category_name e gallery_name também são criadas programaticamente sem nenhum problema.Como mencionei, os subdiretórios (pastas gallery_name) e seu conteúdo (fotos) são apagados com este código. É a pasta category_name que causa o erro, mesmo depois desse código, é apenas uma pasta vazia.A mensagem de exceção que recebo é:
System.IO.IOException was unhandled by user code
HResult=-2147024751
Message=The directory is not empty.
Source=mscorlib
StackTrace:
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.Directory.DeleteHelper(String fullPath, String userPath, Boolean recursive, Boolean throwOnTopLevelDirectoryNotFound)
at System.IO.Directory.Delete(String fullPath, String userPath, Boolean recursive, Boolean checkHost)
at System.IO.Directory.Delete(String path)
at MyApp.PhotoGallery.Categories.deleteCategory(Int32 cID, String categoryname) in d:\Documents\My Dropbox\web projects\MyAppFolder\App_Code\BLL\PhotoGallery.vb:line 291
at _admhades_PhotoGallery.deleteCategory(Int32 categoryID, String categoryname) in d:\Documents\My Dropbox\web projects\HavadisPre\_admhades\PhotoGallery.aspx.vb:line 71