Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 按扩展名在特定文件夹winapi32中搜索_C++_Winapi - Fatal编程技术网

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