2016-10-18 5 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

    作業コードを改善する方法についての質問は、スタックオーバーフローのトピック外であるため、このトピックを議論の対象外としています。そのような質問は、Code Reviewでルールと標準に従って尋ねる必要があります。 – TylerH

    +0

    私はこのトピックを議論の対象外として議論しています。なぜなら、より重視されたコーディングの問題を扱うStack Overflowでは広すぎるためです。作業コードの改善に関する助言については、代わりに[codereview.se]を検討してください。しかし、まず、[Stack Overflowユーザーのためのコードレビューのガイド](// codereview.meta.stackexchange.com/a/5778)を読んでください。そこには違ったやり方で行われました! –

    答えて

    2

    質問の狭い「それを向上させることができる方法を」アスペクトアドレッシング:ループ条件が&&なく||なければならない - それはREADDIRからNULLリターン(スタンドとして)はstrrchr()で参照解除されます。

    関連する問題