gpt4 book ai didi

c++ - 按扩展名过滤搜索文件返回太多结果

转载 作者:太空狗 更新时间:2023-10-29 21:34:53 27 4
gpt4 key购买 nike

我正在开发一个必须在 Windows 操作系统上管理文件的 C++ 控制台应用程序。我需要获得具有特定扩展名的文件名“列表”。我找到了很多解决方案,最推荐的是以下一种:

HANDLE hFind;
WIN32_FIND_DATA data;

hFind = FindFirstFile("C:\\PWS\\*.sda", &data);
if (hFind != INVALID_HANDLE_VALUE) {
do {
cout << data.cFileName << endl;

} while (FindNextFile(hFind, &data));
FindClose(hFind);
}

假设我在 C:\\PWS 文件夹中有这些文件:

  • f001.sdac
  • f002.sda
  • f003.sdab
  • f004.sda

上面的代码打印了所有这些,而我只需要f002.sdaf004.sda

有什么提示吗?

注意:我不想使用 boost 库。

最佳答案

该代码还找到了 "f001.sdac""f003.sdab" 因为 FindFirstFile()FindFirstFileEx()匹配短 (8.3) 和长文件名。例如,"f001.sdac" 的短文件名可能类似于 "f~1.sda"

原因是 backwards compatibility with 16-bit (sigh!) programs .

要解决此问题,请使用 * 通配符调用 FindFirstFile() 以匹配所有文件,然后执行您自己的过滤,例如调用 PathMatchSpec()功能。 PathMatchSpec() 仅进行字符串匹配,因此它没有 FindFirstFile() 的奇怪行为。

WIN32_FIND_DATAW data;    
HANDLE hFind = FindFirstFileW( L"C:\\PWS\\*", &data );
if( hFind != INVALID_HANDLE_VALUE )
{
do
{
if( ( data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) == 0 &&
PathMatchSpecW( data.cFileName, L"*.sda" ) )
{
std::wcout << data.cFileName << std::endl;
}
}
while( FindNextFileW( hFind, &data ) );

FindClose( hFind );
}

旁注:调用 FindFirstFileEx() 并为 fInfoLevelId 参数调用 FindExInfoBasic 的值,这应该是“不查询短文件名”不是此问题的有效解决方案,因为它仍会匹配短 (8.3) 文件名。

关于c++ - 按扩展名过滤搜索文件返回太多结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44920957/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com