2016-05-15 6 views
-2

フォルダをスキャンする方法(たとえば、-C:\ Users \ User \ Documents \ HW)を探して、私はユーザーから得る。どのファイルがまったく同じテキストを返す必要があります。以前はdirent.hを使ったことはなかったし、どうやって作業するのか分かりませんでした。Cのdirentヘッダーを使用してフォルダ内のテキストをスキャンする方法

+1

アイデアは、ディレクトリパスに 'opendir'を使い、' readdir'をループしてすべてのファイルを探し出し、各ファイルに対して 'open'、' read'、 'close'を持つ必要があります。また、ファイルごとに 'fopen'、' fread'、 'fclose'を使うこともできます。終了したら、「closedir」と呼ぶべきです。 –

+0

世界に助けを求める前に、自分でいくつかの調査をしてください。ありがとうございました。 – alk

+0

Henrikありがとう!そして、私が試みたものを推測する。失敗しました。だから、 "世界に助けを求める"というのは間違っていますか?これは質問と回答のためのウェブサイトです! –

答えて

0

あなたがエラーを処理する独自のerror機能定義:そのファイルがディレクトリであれば基本的には、現在のファイルをstatを

// Standard error function 
void fatal_error(const char* message) { 

    perror(message); 
    exit(1); 
} 

トラバース機能を、私たちはそのディレクトリを入力します。ディレクトリ自体では、現在のディレクトリが存在するかどうかを確認することが非常に重要です。これは不定ループにつながる可能性があるからです。

void traverse(const char *pathName){ 

    /* Fetching file info */ 
    struct stat buffer; 
    if(stat(pathName, &buffer) == -1) 
    fatalError("Stat error\n"); 

    /* Check if current file is regular, if it is regular, this is where you 
    will see if your files are identical. Figure out way to do this! I'm 
    leaving this part for you. 
    */ 

    /* However, If it is directory */ 
    if((buffer.st_mode & S_IFMT) == S_IFDIR){ 

    /* We are opening directory */ 
    DIR *directory = opendir(pathName); 
    if(directory == NULL) 
     fatalError("Opening directory error\n"); 

    /* Reading every entry from directory */ 
    struct dirent *entry; 
    char *newPath = NULL; 
    while((entry = readdir(directory)) != NULL){ 

     /* If file name is not . or .. */ 
     if(strcmp(entry->d_name, ".") && strcmp(entry->d_name, "..")){ 

     /* Reallocating space for new path */ 
     char *tmp = realloc(newPath, strlen(pathName) + strlen(entry->d_name) + 2); 
     if(tmp == NULL) 
      fatalError("Realloc error\n"); 
     newPath = tmp; 

     /* Creating new path as: old_path/file_name */ 
     strcpy(newPath, pathName); 
     strcat(newPath, "/"); 
     strcat(newPath, entry->d_name); 

     /* Recursive function call */ 
     traverse(newPath); 
     } 
    } 
    /* Since we always reallocate space, this is one memory location, so we free that memory*/ 
    free(newPath); 

    if(closedir(directory) == -1) 
     fatalError("Closing directory error\n"); 
    } 

} 

ます。またchdir()機能を使用してこれを行うことができ、それはそのように多分簡単ですが、それは非常にilustratingされているので、私は、あなたにこの方法を見せたかったです。しかし、トラフのフォルダ/ファイル階層をトラバースするもっとも簡単な方法は、NFTWです。 manページで確認してください。

ご不明な点がございましたら、お気軽にお問い合わせください。

+0

Aleksandarさん、ありがとうございました! –

関連する問題