0

ディレクトリ内のすべてのファイルを読み込もうとしています。次のコードがあります。

void scanDirectory(char* dir)
{
    WIN32_FIND_DATA FindFileData;
    HANDLE hFind = INVALID_HANDLE_VALUE;

    char DirSpec[MAX_PATH]; // directory specification

    strcpy(DirSpec, dir);
    strcat(DirSpec, "\\*");
    hFind = FindFirstFile(DirSpec, &FindFileData);
    int i = 0;
    do {
        i++;
        printf("%d \n", i);
        if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
        {
            printf("  %s   <DIR>\n", FindFileData.cFileName);
        }
        else
        {
            printf("File %s\n", FindFileData.cFileName);
        }

    } while(!FindNextFile(hFind, &FindFileData));

    FindClose(hFind);
}

問題は、コードを実行すると無限ループになることです。また、「File」のように、出力される文字も変です。

4

3 に答える 3

1

結果として、文字とワイド文字を使用していないと思います。ワイド char 型と wchar_t 型の関数を使用するか、その逆を使用する必要があります。(しかし、それは私にとってコンパイルエラーだったので、ある種のプロジェクト設定にも依存するかもしれません。)

また、 while ループの終了条件も間違ってFindNextFile!FindNextFileます。無限ループは、永久に実行されるファイルが見つからないかのように、この状態が原因である可能性があります。

また、戻り値をテストし、FindFirstFileファイルが見つからない場合はループに入らないようにする必要があります。

于 2011-04-20T09:57:20.003 に答える
0

FindNextFile の代わりに !FindNextFile を呼び出しています。また、FindNextFile が失敗する理由を確認していないため、すべてのファイルが処理されたかどうかを確認できません。このようなものを使用してください。

WIN32_FIND_DATA stFindData;
HANDLE hFind = FindFirstFile(cSearchPattern, &stFindData);
if(hFind != INVALID_HANDLE_VALUE)
{
  do
  {
     // Process File

  }
  while (FindNextFile(hFind, &stFindData) != 0);

  DWORD dwError = GetLastError();
  if (dwError != ERROR_NO_MORE_FILES) 
  {
    // Not All Files processed, deal with Error
  }

  FindClose(hFind);

}
于 2011-04-20T10:29:33.703 に答える
-3

以下のように.Netを使用することはできません:

System.IO.DirectoryInfo dir = new System.IO.DirectoryInfo(Path);
System.IO.FileInfo[] files = dir.GetFiles();
foreach (System.IO.FileInfo file in files)
{
    // Do whatever you need with the file info...
    string filename = file.Name;
    string fullFilename = file.FullName;
}

これは ac# の例ですが、C++ でも同じように for each を使用できます。お役に立てれば。

于 2011-04-20T09:51:38.823 に答える