2015-10-07 3 views
3

Из моей программы я хочу удалить папки с или без файлов/папок в них.Как удалить папки с файлами в нем?

Код:

static void Main(string[] args) 
    { 
     List<string> foldersToDelete = new List<string>(); 

     foreach(var f in System.IO.Directory.GetDirectories(@"C:\Users\Public\MySpecialTempFolder")) 
     { 
      var dir = new DirectoryInfo(f); 
      dir.Attributes = dir.Attributes & ~FileAttributes.ReadOnly; 

      long size = GetDirectorySize(f); 

      // delete folders less then 1 mb 
      if (size < 1000000) 
       foldersToDelete.Add(f); 
     } 

     foreach (var s in foldersToDelete) 
      System.IO.Directory.Delete(s, true); 
    } 

    private static long GetDirectorySize(string folderPath) 
    { 
     DirectoryInfo di = new DirectoryInfo(folderPath); 
     return di.EnumerateFiles("*.*", SearchOption.AllDirectories).Sum(fi => fi.Length); 
    } 

Однако ... когда я запускаю это я получаю Access denied. Что не так, я могу сделать это вручную, щелкнув правой кнопкой мыши на папку и удалите его прямо там и тогда

+1

бежит VS как администратор? –

+1

Возможный дубликат [File.Delete Доступ к пути запрещен] (http://stackoverflow.com/questions/15260146/file-delete-access-to-the-path-is-denied) – Nasreddine

+0

Вы должны опубликовать исключение, которое вы получаете вместе с трассировкой стека, потому что если вы получаете «UnauthorizedAccessException», то в соответствии с [документацией] (https://msdn.microsoft.com/en-us/library/fxeahc5f%28v=vs. 110% 29.aspx) это означает, что «У вызывающего абонента нет требуемого разрешения». Кроме этого ваш код кажется правильным. – Nasreddine

ответ

2

Попробуйте Visual Basic удаления:

var directory = new DirectoryInfo(targetDir); 
if (directory.Exists) 
{ 
    Microsoft.VisualBasic.FileIO.FileSystem.DeleteDirectory(targetDir, Microsoft.VisualBasic.FileIO.DeleteDirectoryOption.DeleteAllContents); 
} 

От File.Delete Access to the path is denied

+0

Как это отличается от удаления из 'System.IO.Directory.Delete'? – Nasreddine

+0

И это не сработало :( – Jason94

+0

@Nasreddine У него есть возможность удалить все содержимое. Является ли папка только для чтения? –

1

Вы можете попробовать силы ваша программа для работы с повышенными привилегиями, чтобы сделать это, щелкните правой кнопкой мыши по каталогу свойств проекта -> Добавить новый элемент, а затем выберите Файл манифеста приложения.

В файле манифеста вы найдете тег requestedExecutionLevel, вы можете установить уровень в три значения.

Установить его:

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

И убедитесь, что ваш проект использовать новый файл манифеста в Properties меню

+0

Не решила проблема im fear :( – Jason94

+0

Почему нет аутентификации = GOD –

0

Если работает VS как администратор не работает, возможно, потребуется удалить атрибуты из каталога и файлов перед удалением.

Взято отсюда https://stackoverflow.com/a/1702920/3922214:

Вывод: всегда удалить все Дира, атрибуты файла diffrent затем Normal перед удалением. Поэтому ниже коды решить эту проблему:

System.IO.DirectoryInfo dir = new System.IO.DirectoryInfo(@"E:\3\{90120000-0021-0000-0000-0000000FF1CE}-C1"); 

if (dir.Exists) 
{ 
    setAttributesNormal(dir); 
    dir.Delete(true); 
} 

. . . 

private void setAttributesNormal(DirectoryInfo dir) 
{ 
    foreach (string subDirPath in dir.GetDirectories()) 
    { 
     setAttributesNormal(new DirectoryInfo(subDirPath)); 
    } 
    foreach (string filePath in dir.GetFiles()) 
    { 
     var file = new FileInfo(filePath) 
     file.Attributes = FileAttributes.Normal; 
    } 
} 
1

Я всегда использовал эту функцию, чтобы удалить папку и ее содержимое. Это будет работать до тех пор, пока у вас есть правильные разрешения для этой папки. Не забудьте добавить using System.IO;, чтобы использовать эту функцию.

private void DeleteDirectory(string path) 
{ 
    if (Directory.Exists(path)) 
    { 
     //Delete all files from the Directory 
     foreach (string file in Directory.GetFiles(path)) 
     { 
      File.Delete(file); 
     } 
     //Delete all child Directories 
     foreach (string directory in Directory.GetDirectories(path)) 
     { 
      DeleteDirectory(directory); 
     } 
     //Delete a Directory 
     Directory.Delete(path); 
     } 
    } 
} 

Найден с этого сайта: http://www.aspsnippets.com/Articles/Delete-all-Directories-Folders-and-Subdirectories-Subfolders-Recursively-using-C-and-VBNet.aspx

Смежные вопросы