Ami*_*mit 2 c++ recursion winapi file
我试图使用WinAPI递归搜索计算机中的文件:FindFirstFile和FindNextFile
我不明白为什么,但我的代码不起作用.在第一次运行中,一切都很好 - 我可以看到C盘中的所有内容.例如C:\Program Files (x86),当我进入子文件夹时,我发现文件夹中的所有文件都是正确的.,而如果我使用的函数没有递归搜索,使用给定的路径C:\Program Files (x86),我会得到一个列表里面的所有文件夹.
这是我的代码:
#include <Windows.h>
#include <iostream>
#include <string>
void FindFile(std::string directory)
{
std::string tmp = directory + "\\*";
WIN32_FIND_DATA file;
HANDLE search_handle=FindFirstFile(tmp.c_str(), &file);
if (search_handle != INVALID_HANDLE_VALUE)
{
do
{
std::wcout << file.cFileName << std::endl;
directory += "\\" + std::string(file.cFileName);
FindFile(directory);
}while(FindNextFile(search_handle,&file));
if (GetLastError() != 18) // Error code 18: No more files left
CloseHandle(search_handle);
}
}
int main()
{
FindFile("C:");
}
Run Code Online (Sandbox Code Playgroud)
该变量tmp用于存储wildchar *,而目录包含要搜索的下一个文件(在循环内).
我的错误是什么?
谢谢!
每个目录(根目录除外)在开头都有两个条目(.和..),您需要跳过这些条目.
否则,您将获得无限递归:
C:\*C:\Program Files (x86)\*C:\Program Files (x86)\.\*C:\Program Files (x86)\.\.\*C:\Program Files (x86)\.\.\.\*等等.
(您还需要检查每个条目是文件还是目录,并且只能递归到目录中.)
例如:
#include <Windows.h>
#include <iostream>
#include <string>
#include <vector>
void FindFile(const std::wstring &directory)
{
std::wstring tmp = directory + L"\\*";
WIN32_FIND_DATAW file;
HANDLE search_handle = FindFirstFileW(tmp.c_str(), &file);
if (search_handle != INVALID_HANDLE_VALUE)
{
std::vector<std::wstring> directories;
do
{
if (file.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
if ((!lstrcmpW(file.cFileName, L".")) || (!lstrcmpW(file.cFileName, L"..")))
continue;
}
tmp = directory + L"\\" + std::wstring(file.cFileName);
std::wcout << tmp << std::endl;
if (file.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
directories.push_back(tmp);
}
while (FindNextFileW(search_handle, &file));
FindClose(search_handle);
for(std::vector<std::wstring>::iterator iter = directories.begin(), end = directories.end(); iter != end; ++iter)
FindFile(*iter);
}
}
int main()
{
FindFile(L"C:");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4609 次 |
| 最近记录: |