Использование MFC CFindFile :: FindNextFile - PullRequest
1 голос
/ 08 сентября 2010

Документация для 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");

Ответы [ 3 ]

4 голосов
/ 08 сентября 2010

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

2 голосов
/ 25 января 2014

В документации также говорится, что если вы получаете код возврата 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();
}

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

PS Просто чтобы прояснить, приведенный выше код не предназначен для работы этого класса.Пожалуйста, не используйте код выше !!!!

0 голосов
/ 26 апреля 2019

FindNextFile возвращает FALSE, это означает, что система не может получить информацию о следующем файле, потому что:

  1. Нет больше файла (скорее всего)
  2. Неожиданная системная ошибка (маловероятно)

Когда это происходит, любой метод запроса информации о текущем файле, включая IsDot, не будет работать.

Всегда проверяйте, что FindNextFile возвращает TRUE, прежде чем запрашивать информацию о текущем файле.

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

// Always check the result of FindNextFile at every iteration
while(oFindFile.FindNextFile())
{
    if (oFindFile.IsDots())
    {
        continue;
    }

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

// Optional, was there a system error?
DWORD error = ::GetLastError();
if (error != ERROR_NO_MORE_FILES) {
    // Log error for auditing
}
...