C++ 按扩展名在特定文件夹winapi32中搜索
我试图创建一个搜索目录,但同时。我想在多个目录中搜索特定的文件,如C++ 按扩展名在特定文件夹winapi32中搜索,c++,winapi,C++,Winapi,我试图创建一个搜索目录,但同时。我想在多个目录中搜索特定的文件,如.txt和.jpg,但我如何才能做到这一点?这就是我目前得到的 int _tmain(int argc, TCHAR* argv[]) { WIN32_FIND_DATA ffd; LARGE_INTEGER filesize; TCHAR szDir[MAX_PATH]; size_t length_of_arg; HANDLE hFind = INVALID_HANDLE_VALUE;
.txt和.jpg
,但我如何才能做到这一点?这就是我目前得到的
int _tmain(int argc, TCHAR* argv[])
{
WIN32_FIND_DATA ffd;
LARGE_INTEGER filesize;
TCHAR szDir[MAX_PATH];
size_t length_of_arg;
HANDLE hFind = INVALID_HANDLE_VALUE;
DWORD dwError = 0;
StringCchCopy(szDir, MAX_PATH, L"C:\\Users\\USER-U\\Documents\\aaa\\project1\\Release\\");
StringCchCat(szDir, MAX_PATH, TEXT("\\*"));
// Find the first file in the directory.
hFind = FindFirstFile(szDir, &ffd);
// List all the files in the directory with some info about them.
do
{
if (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
_tprintf(TEXT(" %s <DIR>\n"), ffd.cFileName);
}
else
{
filesize.LowPart = ffd.nFileSizeLow;
filesize.HighPart = ffd.nFileSizeHigh;
_tprintf(TEXT(" %s %ld bytes\n"), ffd.cFileName, filesize.QuadPart);
}
} while (FindNextFile(hFind, &ffd) != 0);
dwError = GetLastError();
FindClose(hFind);
return dwError;
}
int\u tmain(int-argc,TCHAR*argv[]
{
WIN32_查找_数据ffd;
大整数文件大小;
TCHAR szDir[MAX_PATH];
参数的大小和长度;
句柄hFind=无效的句柄值;
DWORD dwError=0;
StringCchCopy(szDir,最大路径,L“C:\\Users\\USER-U\\Documents\\aaa\\project1\\Release\”;
StringCchCat(szDir,最大路径,文本(“\\*”);
//查找目录中的第一个文件。
hFind=FindFirstFile(szDir和ffd);
//列出目录中的所有文件及其相关信息。
做
{
if(ffd.dwFileAttributes和文件属性目录)
{
_tprintf(文本(“%s\n”),ffd.cFileName);
}
其他的
{
filesize.LowPart=ffd.nFileSizeLow;
filesize.HighPart=ffd.nFileSizeHigh;
_tprintf(文本(“%s%ld字节\n”)、ffd.cFileName、filesize.QuadPart);
}
}while(FindNextFile(hFind,&ffd)!=0);
dwError=GetLastError();
FindClose(hFind);
返回dwError;
}
如果要搜索多个文件类型,则不支持它,但您可以使用*.*
并过滤结果。
如果要检索子目录,可以使用递归函数进行检索(如果当前搜索是目录),稍后我将更新该示例
更新:
#include <windows.h>
#include <iostream>
#include <tchar.h>
#pragma warning (disable: 4996)
void retrievetxt(TCHAR* szDir)
{
WIN32_FIND_DATA ffd;
LARGE_INTEGER filesize;
_tcscat(szDir, _T("\\*"));
HANDLE hFind = FindFirstFile(szDir, &ffd);
// List all the files in the directory with some info about them.
do
{
if (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
if (!_tcscmp(ffd.cFileName, _T(".")) || !_tcscmp(ffd.cFileName, _T("..")))
continue;
TCHAR szDircpy[MAX_PATH] = { 0 };
_tcscpy(szDircpy, szDir);
szDircpy[_tcslen(szDircpy)-1] = _T('\0'); // remove "*" character from "xxx\\*"
_tcscat(szDircpy, ffd.cFileName); //add the subdirectory name into szDir
_tprintf(TEXT("Go into %s\\%s <DIR>\n"), szDircpy, ffd.cFileName);
retrievetxt(szDircpy);
}
else
{
int size = _tcslen(ffd.cFileName);
if (size > 4 && !_tcscmp(ffd.cFileName + size - _tcslen(_T(".txt")), _T(".txt")))
{
filesize.LowPart = ffd.nFileSizeLow;
filesize.HighPart = ffd.nFileSizeHigh;
_tprintf(TEXT("%s %ld bytes\n"), ffd.cFileName, filesize.QuadPart);
}
}
} while (FindNextFile(hFind, &ffd) != 0);
FindClose(hFind);
}
int _tmain(int argc, TCHAR* argv[])
{
TCHAR szDir[MAX_PATH] = { 0 };
_tcscpy(szDir,_T("C:\\Users\\drakew\\Desktop\\Newfolder"));
_tprintf(TEXT("Go into %s <DIR>\n"), szDir);
retrievetxt(szDir);
getchar();
return 0;
}
#包括
#包括
#包括
#杂注警告(禁用:4996)
无效检索文本(TCHAR*szDir)
{
WIN32_查找_数据ffd;
大整数文件大小;
_tcscat(szDir,\\\*);
HANDLE hFind=FindFirstFile(szDir和ffd);
//列出目录中的所有文件及其相关信息。
做
{
if(ffd.dwFileAttributes和文件属性目录)
{
如果(!tcscmp(ffd.cFileName,T(“.”);|!tcscmp(ffd.cFileName,T(“…”))
继续;
TCHAR szDircpy[MAX_PATH]={0};
_tcscpy(szDircpy,szDir);
szDircpy[\u tcslen(szDircpy)-1]=\T('\0');//从“xxx\\*”中删除“*”字符
_tcscat(szDircpy,ffd.cFileName);//将子目录名添加到szDir中
_tprintf(文本(“进入%s\\%s\n”),szDircpy,ffd.cFileName);
检索文本(szDircpy);
}
其他的
{
int size=\u tcslen(ffd.cFileName);
如果(大小>4&&!\u tcscmp(ffd.cFileName+大小-\u tcslen(\u T(.txt)),\u T(.txt)))
{
filesize.LowPart=ffd.nFileSizeLow;
filesize.HighPart=ffd.nFileSizeHigh;
_tprintf(文本(“%s%ld字节\n”)、ffd.cFileName、filesize.QuadPart);
}
}
}while(FindNextFile(hFind,&ffd)!=0);
FindClose(hFind);
}
int_tmain(int argc,TCHAR*argv[])
{
TCHAR szDir[MAX_PATH]={0};
_tcscpy(szDir,_T(“C:\\Users\\drakew\\Desktop\\Newfolder”);
_tprintf(文本(“进入%s\n”),szDir;
检索文本(szDir);
getchar();
返回0;
}
如果要使用多个扩展名进行搜索,可以使用
例如,在目录“e:\test”=>
(参考:SDK示例)
您想同时使用不同的文件类型进行搜索还是检索子目录?因为您知道如何获取目录中的文件列表,所以调整它以获取两个目录中的文件列表应该不难。并对文件名进行一些过滤。(您“迄今为止”的代码似乎只是从中复制的。)是的,但例如,如果我想实现更多thn 400扩展。如果可以,则不能使用400
。此外,还有一些避免大型if-else语句的方法,例如使用查找/哈希表。不过,这并没有改变一般建议的任何内容(您需要自己过滤这些扩展)。哇,11级嵌套if
语句CComPtr
救援!是:-)但我总是复制旧代码的粘贴部分(90年代…)来制作示例,我太懒了,无法用CComPtr重写错误处理程序
HRESULT hr = S_OK;
ISearchFolderItemFactory* pSearchFolderItemFactory = NULL;
hr = CoCreateInstance(__uuidof(SearchFolderItemFactory), NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pSearchFolderItemFactory));
if (SUCCEEDED(hr))
{
WCHAR wsFolder[MAX_PATH] = L"e:\\test";
IShellItem *pShellItem = NULL;
HRESULT hr = SHCreateItemFromParsingName(wsFolder, NULL, IID_PPV_ARGS(&pShellItem));
if (SUCCEEDED(hr))
{
IShellItemArray* pShellItemArray = NULL;
hr = SHCreateShellItemArrayFromShellItem(pShellItem, IID_IShellItemArray, (void**)&pShellItemArray);
if (SUCCEEDED(hr))
{
hr = pSearchFolderItemFactory->SetScope(pShellItemArray);
IQueryParserManager *pQueryParserManager = NULL;
HRESULT hr = CoCreateInstance(__uuidof(QueryParserManager), NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pQueryParserManager));
if (SUCCEEDED(hr))
{
IQueryParser *pQueryParser = NULL;
hr = pQueryParserManager->CreateLoadedParser(L"SystemIndex", LOCALE_USER_DEFAULT, IID_PPV_ARGS(&pQueryParser));
if (SUCCEEDED(hr))
{
IQuerySolution* pQuerySolution = NULL;
hr = pQueryParser->Parse(L"*.jpg OR *.png", NULL, &pQuerySolution);
if (SUCCEEDED(hr))
{
ICondition* pCondition = NULL;
hr = pQuerySolution->GetQuery(&pCondition, NULL);
if (SUCCEEDED(hr))
{
SYSTEMTIME st;
GetLocalTime(&st);
ICondition* pConditionResult = NULL;
hr = pQuerySolution->Resolve(pCondition, SQRO_DONT_SPLIT_WORDS, &st, &pConditionResult);
if (SUCCEEDED(hr))
{
hr = pSearchFolderItemFactory->SetCondition(pConditionResult);
if (SUCCEEDED(hr))
{
IShellItem* pShellItem = NULL;
hr = pSearchFolderItemFactory->GetShellItem(IID_PPV_ARGS(&pShellItem));
if (SUCCEEDED(hr))
{
IEnumShellItems *pEnumShellItems = NULL;
hr = pShellItem->BindToHandler(NULL, BHID_EnumItems, IID_PPV_ARGS(&pEnumShellItems));
if (SUCCEEDED(hr))
{
IShellItem *psi;
PWSTR pszName = NULL;
while (S_OK == pEnumShellItems->Next(1, &psi, NULL))
{
hr = psi->GetDisplayName(SIGDN_FILESYSPATH, &pszName);
WCHAR wsBuffer[MAX_PATH];
wsprintf(wsBuffer, L"File : %s\n", pszName);
OutputDebugString(wsBuffer);
psi->Release();
}
pEnumShellItems->Release();
}
pShellItem->Release();
}
}
pConditionResult->Release();
}
pCondition->Release();
}
pQuerySolution->Release();
}
pQueryParser->Release();
}
pQueryParserManager->Release();
}
pShellItemArray->Release();
}
pShellItem->Release();
}
pSearchFolderItemFactory->Release();
}