2016-10-18 4 views
1

내 PC의 백업 대상으로 사용한 외장 하드 디스크가 있습니다. 분명히 읽을 수 없게되었으므로 회복해야했습니다. 복구 프로그램은 모든 파일을 HD의 루트에 저장하므로 기본 폴더에 300.000 개의 파일이 있습니다.외부 HD의 루트에있는 엄청난 수의 파일 삭제

폴더의 확장명에 따라 파일 (JPG, 3GP, TIFF, C/H 헤더 등)을 다시 구성했습니다. 그렇다면 여전히 백업의 어딘가에서 오는 .html과 .htm 파일의 거대한 (60.000) 개의 파일이 있습니다.이 파일은 Windows 10 탐색기에서 이동하거나 삭제할 수 없습니다 (멈춤).

주요 과제는 다음과 같습니다

  1. 파일 내 HD의 루트에있는 -> 내가 (둘 다 내가 폴더에 복사 할 수 없습니다, 또는 모든 정지)
  2. 제거 디렉토리 명령을 사용할 수 없습니다 나는 내가 실제로 잘 작동이 C 프로그램을 작성

충분히 비어있는 저장 공간을 가지고 있지 않기 때문에 HD에

  • 다른 파일을 다른 PC로 이동할 수 없습니다,하지만 난 그것을 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

    작업 코드를 향상시킬 수있는 방법에 대한 질문이 스택 오버플로에서 벗어난 주제이므로이 주제를 오프 토픽으로 닫으려고합니다. 이러한 질문은 코드 검토에서 규칙 및 표준에 따라 문의해야합니다. – TylerH

    +0

    더 집중된 코딩 문제를 다루는 스택 오버플로가 너무 광범위하기 때문에이 질문을 주제와 관련이 없도록 닫으려고합니다. 작업 코드 개선에 대한 조언을 얻으려면 대신 [codereview.se]를 고려하십시오. 먼저 [Stack Overflow 사용자를위한 코드 검토 안내서] (// codereview.meta.stackexchange.com/a/5778)를 읽으십시오. 저기 다르게 끝났어. –

    답변

    2

    질문의 좁은 "이를 개선 할 수있는 방법"측면을 주소 : 루프 조건이 &&보다는 ||해야한다 -이 readdir을에서 NULL 반환을 (약자로)는 strrchr()에서 참조 해제됩니다.

    관련 문제