2017-11-15 22 views
0

私のプログラムはユーザーからの入力パスを取得しており、.csvファイルの列に対応する名前のファイルを探しています。oldpathはユーザー入力パス、その後、私はget_between_delimiterをwhileループで使って、.csvの各行の最初のセルから探しているファイルの名前を取得しています。Cフォルダとサブフォルダ内のファイルの再帰的検索

私が理解できないことは、どのようにすべてをチェックするかですそのファイルのサブディレクトリが、ベースディレクトリに存在しない場合やすぐに、プログラムの機能を維持している場合

strcpy(oldnp, oldpath); 
    strcat(oldnp, "/"); 
    strcat(oldnp, get_between_delimiter(commande[cnt] , 0)); 
    strcat(oldnp, ".png"); 
    source = fopen(oldnp, "r"); 
    if ((source = fopen(oldnp, "r")) == NULL) 
    file_found(); 
    else 
    ;? 

答えて

1

FindFirstFileを使用して、ディレクトリ内のすべてのファイルを一覧表示し、各ファイルと比較します。または、再帰的な検索を行い、各サブディレクトリを検索します。

「ワイルドカード」も調整できます。

この例では、それはそれを見つけられない場合、それはそれが通過するために起こっているので、あなたが"C:\"に再帰的な検索を実行しないことを確認してください"c:\\test"

のサブディレクトリになります、"c:\\test""something.png"を探しますドライブ上のすべてのファイル。

#include <stdio.h> 
#include <Windows.h> 

int findfile_recursive(const char *folder, const char *filename, char *fullpath) 
{ 
    char wildcard[MAX_PATH]; 
    sprintf(wildcard, "%s\\*", folder); 
    WIN32_FIND_DATA fd; 
    HANDLE handle = FindFirstFile(wildcard, &fd); 
    if(handle == INVALID_HANDLE_VALUE) return 0; 
    do 
    { 
     if(strcmp(fd.cFileName, ".") == 0 || strcmp(fd.cFileName, "..") == 0) 
      continue; 
     char path[MAX_PATH]; 
     sprintf(path, "%s\\%s", folder, fd.cFileName); 

     if(_stricmp(fd.cFileName, filename) == 0) 
      strcpy(fullpath, path); 
     else if(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) 
      findfile_recursive(path, filename, fullpath); 
     if(strlen(fullpath)) 
      break; 
    } while(FindNextFile(handle, &fd)); 
    FindClose(handle); 
    return strlen(fullpath); 
} 

int main(void) 
{ 
    char fullpath[MAX_PATH] = { 0 }; 
    if(findfile_recursive("c:\\test", "something.png", fullpath)) 
     printf("found: %s\n", fullpath); 
    return 0; 
} 
+0

ありがとうございます、今すぐ実装しようとしているようです。 –

関連する問題