Как очистить пустые папки и файлы

238
13 апреля 2017, 15:32

Не получается очистить папки не имеющие файлов (пустые) и файлы не имеющие размера. Пробую так:

static string str1 = Path.GetTempPath();
public static void EmptyDirFiles()
{
  string[] dirs = Directory.GetDirectories(str1, "*", SearchOption.AllDirectories);
  for (int i = dirs.Length - 1; i >= 0; i--)
  {
    if (Directory.GetFileSystemEntries(dirs[i]).Length == 0)
        Directory.Delete(dirs[i]);
  }
}

Но не удаляет, и лучше ли будет заменить GetDirectories на EnumerateDirectories ?

[Обновление] Изменил код:

string[] dirs = Directory.EnumerateDirectories(str1, "*", SearchOption.AllDirectories).ToArray();
for (int i = dirs.Length - 1; i >= 0; i--)
{
   if (Directory.EnumerateFileSystemEntries(dirs[i]).Count() == 0)
       Directory.Delete(dirs[i]);
}

Отчищает только папки, как очистить файлы пустые?

[Обновил ответ по просьбе: Sv__t]

string[] dirs = Directory.EnumerateDirectories(str1, "*", SearchOption.AllDirectories).ToArray();
DirectoryInfo dirInfo = new DirectoryInfo(str1);
for (int i = dirs.Length - 1; i >= 0; i--)
{
   if (Directory.EnumerateFileSystemEntries(dirs[i]).Count() == 0)
       Directory.Delete(dirs[i], true);
}
foreach (string pathToFile in Directory.GetFiles(str1))
{
   if (new FileInfo(pathToFile).Length == 0)
           File.Delete(pathToFile);
}
Answer 1

Удаление пустых файлов можно сделать так:

// Directory.GetFiles(str1) возвращает все пути к файлам в указанной директории
foreach(string pathToFile in Directory.GetFiles(str1))
{
     // здесь получаем размер файла и проверяем его
     if (new FileInfo(pathToFile).Length == 0)
     {
          try
          {
              File.Delete(pathToFile);
          }
          catch(Exception ex)
          {
             // обработка исключения
          }
     } 
}

Update

Если с использованием тасков, то

для директорий:

        IEnumerable<String> dir = Directory.EnumerateDirectories(str1).
           Where(x => new DirectoryInfo(x).EnumerateFiles().Count() == 0);
        foreach (var d in dir)
        {
            new Task(() => Directory.Delete(d)).Start();
        }

для файлов:

        IEnumerable<String> files = Directory.EnumerateFiles(str1).
           Where(y => new FileInfo(y).Length == 0);
        foreach(var f in files)
        {
            new Task(() => File.Delete(f)).Start();
        }
READ ALSO
Отображение информации из массива в DataGrid

Отображение информации из массива в DataGrid

Не могу разобраться как выводить данные из трёхмерного массива в DataGridПолучаю данные из БД в массив вида:

239
Не срабатывает Equals

Не срабатывает Equals

Данное условие почему-то возвращает false, не сравнивается ни с помощью equals, ни с помощью ==Как следствие, неправильно работает linq

192
Chart C# Заменить числа на Ох (1,2,3&hellip;) на (Pi/2,Pi,&hellip;)

Chart C# Заменить числа на Ох (1,2,3…) на (Pi/2,Pi,…)

Сам интервал мы меняем chart1ChartAreas[0]

213
Не могу понять код

Не могу понять код

Страница 50 книги "C# для начинающих" Мартина ДрейераВ код необходимо добавить метод

179