Почему FindNextFile не работает в Windows 7 - PullRequest
2 голосов
/ 28 января 2012

Этот код работает на Windows XP дома, но не работает на 64-битной Windows 7. Цикл не вводится ни разу, хотя в поставляемой папке более 50 файлов. Он не только не входит, но и возвращает ERROR_NO_MORE_FILES для GetLastError. Почему?

string dir = "d:\\validfolder";
WIN32_FIND_DATA ffd;
HANDLE h = FindFirstFile(dir.c_str(), &ffd);
while(FindNextFile(h, &ffd))
{
// some operation
}
DWORD dw = GetLastError();// returns ERROR_NO_MORE_FILES

Я пытался Wow64DisableWow64FsRedirection, но это не имеет никакого эффекта.

Ответы [ 2 ]

7 голосов
/ 28 января 2012

Вам необходимо добавить файл подстановки в ваш каталог:

string dir = "d:\\validfolder\\*";

Для того, чтобы он перечислял файлы в каталоге.В противном случае вы запрашиваете только информацию о самом каталоге.

По крайней мере, так я прочитал документацию для FindFirstFile

Чтобы проверить каталог, который не является корневым каталогом, используйте путь к этому каталогу беззамыкающий обратный слеш.Например, аргумент «C: \ Windows» возвращает информацию о каталоге «C: \ Windows», а не о каталоге или файле в «C: \ Windows».Чтобы проверить файлы и каталоги в «C: \ Windows», используйте lpFileName «C: \ Windows *».

Я не знаю, почему он работает на вас на XP

3 голосов
/ 28 января 2012

Этот код неверен по нескольким причинам.

Вы должны проверить возвращаемое значение FindFirstFile.Если вызов FindFirstFile успешен, то у вас уже есть первый файл в ffd.Поскольку ваш код стоит, вы выбрасываете первый файл.Так что вам нужно заново настроить логику цикла, чтобы учесть это.Естественно, если GetLastError возвращает ERROR_NO_MORE_FILES, то это означает, что поиск исчерпал все файлы.

Итак, вероятно, вы запрашиваете первый файл, соответствующий строке поиска "d:\\validfolder".Возвращается в ffd после вызова FindFirstFile.Затем вы игнорируете эту информацию и запрашиваете следующий матч.Но последующего совпадения нет, поскольку существует только один объект, соответствующий "d:\\validfolder", поскольку вы не включили в шаблон поиска символы подстановки.

Этот код будет вести себя точно так же в XP, как и в Windows 7, и я подозреваючто вы не используете один и тот же код в обеих системах.

Если вы хотите перечислить содержимое папки, вам нужно выполнить поиск "d:\\validfolder\\*".Как то так:

string dir = "d:\\validfolder\\*";
WIN32_FIND_DATA ffd;
HANDLE h = FindFirstFile(dir.c_str(), &ffd);
BOOL success = h<>INVALID_HANDLE_VALUE;
while(success)
{
    // do something with ffd
    success = FindNextFile(h, &ffd));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...