Использование MFC CFindFile::FindNextFile

В документации для CFindFile указано, что

Ненулевое значение, если файлов больше; ноль, если найденный файл является последним в каталоге или если произошла ошибка. Чтобы получить расширенную информацию об ошибке, вызовите функцию Win32 GetLastError. Если найденный файл является последним файлом в каталоге или соответствующие файлы не найдены, функция GetLastError возвращает ERROR_NO_MORE_FILES.

Итак, как мне узнать, есть ли у меня 1 файл или 0 файлов, если вызов FindNextFile возвращает одно и то же значение?

Кажется, что вызов FindFile::GetFilePath() терпит неудачу (что непреднамеренно приводит к сбою моего приложения), если не найдено ни одного файла.

pLog->Log(_T("Finding files in [%s]"), 1, szFilePath);

    if (!oFindFile.FindFile(szFilePath, 0))
{
    pLog->Log(_T("Failed to find file in directory: [%s]"),1,szDirectory);
    return false;
}

bool moreFiles = true;
while(moreFiles)
{
    moreFiles = oFindFile.FindNextFile();
    if (oFindFile.IsDots())
    {
        continue;
    }

    CString szFileName = oFindFile.GetFilePath();
    pLog->Log(_T("Found file [%s]"), 1, szFileName);
    pVector->push_back(szFileName);
}
return true;

Изменить

CString szFilePath = _T("C:\documents and settings\username\desktop\*.lnk");
CString szDirectory = T("C:\documents and settings\username\desktop");

person Adam Driscoll    schedule 08.09.2010    source источник


Ответы (2)


Если файлов нет, ваш вызов CFileFind::FindFile вернет false. Вам нужно вызвать это, прежде чем вы сможете вызвать FindNextFile.

person dwo    schedule 08.09.2010
comment
Хм, хорошо. Я вызываю эту функцию. Может я еще что-то не так делаю... - person Adam Driscoll; 08.09.2010
comment
Конечно. Первый оператор журнала вызывается, а второй (в блоке if) не вызывается. - person Adam Driscoll; 08.09.2010
comment
Каково содержимое szFilePath и szDirectory? - person dwo; 08.09.2010
comment
Подождите... придержите лошадей. Я думаю, что знаю, что это такое, и это связано с szDirectory... - person Adam Driscoll; 08.09.2010
comment
Не хватает двойной обратной косой черты \\ ? - person dwo; 08.09.2010
comment
В каталоге 0 совпадений. Бывает, что szDirectory на самом деле содержит нерасширенные переменные окружения; который по какой-то причине убивал механизм ведения журнала. Вот поэтому и нет лога :). Спасибо за идеи по устранению неполадок, хотя это действительно помогло мне отследить это. Теперь, чтобы посмотреть на этот глупый материал для регистрации. - person Adam Driscoll; 08.09.2010

В документации также говорится, что если вы получаете код возврата 0 от «FindNextFile», вы должны вызвать «GetLastError()», чтобы узнать, равно ли оно «ERROR_NO_MORE_FILES». Мне до сих пор не совсем ясно, что код возврата 0 означает «Я нашел еще один файл, так что обработайте его», а не «Я не нашел никаких файлов, поэтому не вызывайте другие API, иначе вы выйдете из строя».

Я думаю, Microsoft нужно переосмыслить этот класс, чтобы «1» означало, что я нашел файл, а «0» означает, что я не нашел файл. Тогда код можно было бы написать так:

(Отказ от ответственности: НЕ ИСПОЛЬЗУЙТЕ ЭТОТ КОД! ЭТО НЕПРАВИЛЬНО! КАЖДЫЙ РАЗ ВЫ БУДЕТЕ ПРОПУСКАТЬ ОДИН ФАЙЛ!)

CFileFind cff;
if ( cff.FindFile(_T("*.*")) )
{
    while ( cff.FindNextFile() )
    {
        // Use the API's here without fear of crashing...
    }
    cff.Close();
}

Но это не то, как они разработали этот класс. Я предполагаю, что суть такова: используйте на свой страх и риск.

P.S. Просто для ясности: приведенный выше код не предназначен для работы этого класса. ПОЖАЛУЙСТА, НЕ ИСПОЛЬЗУЙТЕ КОД ВЫШЕ!!!!

person Dave    schedule 24.01.2014