CFileFind не учитывает первый файл каталога

У меня проблема с получением последнего файла каталога.
Мой код работает нормально, если в этой папке нет только одного файла.
Я использую CFileFind класс, чтобы все это произошло. Я посмотрел на документацию Microsoft, и там написано, что .GetFileName можно вызвать только после FindNextFile, Если у кого-то есть решение, я был бы очень благодарен.
Вот мой код:

std::string getLatestFile(std::string directory, const std::string& extension) {
FILETIME mostRecent = { 0, 0 };
FILETIME curDate;
std::string name;
CFileFind finder;
if (!CheckIfDirectory(directory))
return "";
ensureProperTermination(directory);//this just makes sure that the path is "\\" terminated
if (extension[0] == '.')
finder.FindFile((directory + "*" + extension).c_str());
else
finder.FindFile((directory + "*." + extension).c_str());

while (finder.FindNextFile())
{
finder.GetCreationTime(&curDate);

if (CompareFileTime(&curDate, &mostRecent) > 0)
{
mostRecent = curDate;
name = finder.GetFileName().GetString();
}
}
return directory + name;
}

1

Решение

Сделай это так:

void GetAllFilesNames(const CString& sMask, CStringArray& files)
{
CFileFind finder;
BOOL bWorking = finder.FindFile(sMask);
while (bWorking)
{
bWorking = finder.FindNextFile();

// skip . and .. files
if (!finder.IsDots())
{
files.Add(finder.GetFileName());
}
}

}

Так что вызов будет выглядеть так:

CStringArray Files;
GetAllFilesNames(_T("C:\\Test\\*.txt"), Files);

В вашем случае это будет выглядеть так:

CString GetMostRecent(const CString& sMask)
{
CFileFind finder;
BOOL bWorking = finder.FindFile(sMask);
CTime dt;
CString sMostRecent;
while (bWorking)
{
bWorking = finder.FindNextFile();

// skip . and .. files
if (!finder.IsDots())
{
CTime lw;
finder.GetLastWriteTime(lw);

if (lw > dt)
{
dt = lw;
sMostRecent = finder.GetFileName();
}

}
}

return sMostRecent;

}

2

Другие решения

Других решений пока нет …