Проблемы с Visual C ++: чтение всех файлов в каталоге - PullRequest
0 голосов
/ 20 апреля 2011

Я пытаюсь прочитать все файлы в каталоге.У меня есть следующий код:

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);
}

Проблема в том, что когда я выполняю код, это приводит к бесконечному циклу.Также странные символы вывода, такие как «Файл».

Ответы [ 3 ]

1 голос
/ 20 апреля 2011

Я думаю, что вы не используете символы и широкие символы последовательно. Вы должны либо использовать функции с широким типом char и wchar_t, либо наоборот. (Но для меня это была ошибка компиляции, поэтому она также может зависеть от некоторых настроек проекта.)

И ваше условие выхода в цикле while также неверно, оно должно проверяться на FindNextFile, а не !FindNextFile. Из-за этого условия может возникнуть бесконечный цикл, как будто он не находит никаких файлов, он будет работать вечно.

Также вам следует проверить возвращаемое значение FindFirstFile и не заходить в цикл, если он не находит никаких файлов.

0 голосов
/ 20 апреля 2011

Вы звоните! 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);

}
0 голосов
/ 20 апреля 2011

Вы не можете просто использовать .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;
}

Это пример c #, но вы можете использовать для каждого в C ++ одно и то же. Надеюсь, это поможет.

...