2016-10-18 3 views
1

У меня есть внешний жесткий диск, который я использовал в качестве места назначения для резервного копирования для своего ПК. Затем мне пришлось его восстановить, поскольку, видимо, он стал нечитаемым. Программа восстановления поместила все файлы в корневой каталог HD, так что у меня есть 300 000 файлов в основной папке.Удалите огромное количество файлов в корне внешнего HD

Я повторно организовал файлы (JPG, 3GP, TIFF, C/H заголовки и т. Д.) В соответствии с их расширением в папках. Затем у меня все еще есть огромное (60 000) количество файлов .html и .htm, которые откуда-то появляются в резервной копии, которые я не могу переместить или удалить из проводника Windows 10 (он зависает).

Основными задачами являются:

  1. файлы находятся в корневом каталоге моего HD -> Я не могу использовать команду каталога удалить (ни я не могу скопировать их в папку, или все замерзает)
  2. другие файлы в HD не может быть перемещен на другой компьютер, так как у меня нет достаточно свободного места для хранения

Я написал эту C программу, которая на самом деле работала хорошо, но я должен был запустить его в 3 раза, потому что он разбился из-за SIGSEV.

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

Код:

#include <stdio.h> 
    #include <sys/types.h> 
    #include <dirent.h> 
    #include <stdlib.h> 
    #include <string.h> 

    void makeStr (char* fileName, char* file) 
    { 
     static char* str = "F:/"; 

     //Build the string 
     sprintf (fileName, "%s%s", str, file); 
     return; 
    } 

    int main (void) 
    { 
     DIR *dp; 
     struct dirent *ep; 
     dp = opendir ("F:/"); 
     char* ext; 
     char name[260]; 
     int count = 0; 
     const char* format1 = "html"; 
     const char* format2 = "htm"; 

     if (dp != NULL) 
     { 
      // Look in the folder 
      while (((ep = readdir (dp)) != NULL) || count < 60000) 
      { 
       count++; 
       // Find files with an associated file type 
       ext = strrchr(ep->d_name, '.'); 
       if (!ext) 
       { 
        /* no extension */ 
       } 
       else 
       { 
        if (memcmp((char*)format1, (char*)(ext + 1), 4) == 0) 
        { 
         makeStr(name, ep->d_name); 
         if(remove(name) == -1) 
         { 
          printf ("ERROR REMOVING %s\n", ep->d_name); 
          //exit(-1); 
         } 
        } 
        else if (memcmp((char*)format2, (char*)(ext + 1), 3) == 0) 
        { 
         makeStr(name, ep->d_name); 
         if(remove(name) == -1) 
         { 
          printf ("ERROR REMOVING %s\n", ep->d_name); 
          //exit(-1); 
         } 
         else if (count % 100 == 0) 
         { 
          printf("Going well: %d files removed . . .\n",count); 
         } 

        } 
       } 
       //printf ("%s\n", ep->d_name); 
      } 

     closedir (dp); 
     } 
     else 
     printf ("Couldn't open the directory"); 

     return 0; 
    } 
+3

Я голосую, чтобы закрыть этот вопрос как не относящийся к теме, потому что вопросы о том, как рабочий код можно улучшить, вне темы в Stack Overflow. Вместо этого такие вопросы следует задавать по пересмотру кода в соответствии с их правилами и стандартами. – TylerH

+0

Я голосую, чтобы закрыть этот вопрос как не по теме, потому что он слишком широк для Stack Overflow, который имеет дело с более целенаправленными проблемами с кодированием. Для получения рекомендаций по улучшению рабочего кода рассмотрите [codereview.se] вместо этого, но сначала прочитайте [Руководство по обзору кода для пользователей переполнения стека] (// codereview.meta.stackexchange.com/a/5778), поскольку некоторые вещи сделано по-другому там !. –

ответ

2

адресация только узкий «как это можно улучшить» аспект вопроса: условия цикла должны быть &&, а не || - как это означает возвращение NULL из ReadDir () будет разыменован в strrchr().