我需要一种在计算机上搜索Windows资源管理器等文件的方法。我希望我的程序搜索让我们说硬盘c:。我需要它来搜索C:\中的文件夹和文件(只是你可以在c:\中看到的那些,那么如果用户点击列表上的文件,比如文件夹测试(C:\ test),它会搜索测试并让用户可以看到其中的文件/文件夹。
答案 0 :(得分:14)
由于您提到了窗口,因此使用FindFirstFile和FindNextFile功能的最直接的winapi方法就是使用。
编辑:这是一个示例,向您展示如何枚举目录中的所有文件/文件夹。
#include <Windows.h>
#include <iostream>
int main()
{
WIN32_FIND_DATA file;
HANDLE search_handle=FindFirstFile(L"C:\\*",&file);
if (search_handle)
{
do
{
std::wcout << file.cFileName << std::endl;
}while(FindNextFile(search_handle,&file));
FindClose(search_handle);
}
}
答案 1 :(得分:6)
这将取决于操作系统。 SO问题
How can I get a list of files in a directory using C or C++?
很好地处理了这个问题。您可以在此处下载DIRENT。
现在你有这个,我建议递归搜索一个DFS / BFS算法的文件。您可以假设整个目录结构是tree,其中每个文件都是叶节点,每个子目录都是一个内部节点。
所以你要做的就是,
void getFilesFolders(vector<string> & dir_list, const string & folder_name)
答案 2 :(得分:2)
您可以使用Directory
类成员使用C#或托管C ++执行此操作。请参阅以下MSDN文章:
http://support.microsoft.com/kb/307009
如果您希望将C ++与MFC一起使用,可以使用CFileFind
http://msdn.microsoft.com/en-us/library/f33e1618%28v=VS.80%29.aspx
您必须提供自己的浏览窗口才能显示文件系统树。
或者您可以使用其中一个目录/文件控件为您执行这两项操作。
答案 3 :(得分:2)
boost :: filesystem可以是一个跨平台的解决方案(检查其中的这些功能)。
答案 4 :(得分:2)
#include <Windows.h>
#include <iostream>
int FindF(char* pDirectory)
{
char szFindPath[MAX_PATH] = {0};
strcpy(szFindPath, pDirectory);
strcat(szFindPath, "\\*");
WIN32_FIND_DATA file;
HANDLE search_handle=FindFirstFile(szFindPath,&file);
if (search_handle)
{
do
{
if(file.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY)
{
strcpy(szFindPath, pDirectory);
strcat(szFindPath, "\\");
strcat(szFindPath, file.cFileName);
FindF(szFindPath);
}
std::wcout << file.cFileName << std::endl;
}while(FindNextFile(search_handle,&file));
CloseHandle(search_handle);
}
}
答案 5 :(得分:1)
确实没有必要使用第三方库来实现这一目标。这是一个简短的独立函数,它列出了目录中的所有文件(及其路径),包括子目录&#39;文件。 std::string folderName
必须以\
结束,如果要列出计算机上的所有文件,只需在调用函数中创建一个循环以及GetLogicalDriveStrings(它返回带有\
的字符串,所以在这种情况下它不会更方便。)
void FindAllFiles(std::string folderName)
{
WIN32_FIND_DATA FileData;
std::string folderNameWithSt = folderName + "*";
HANDLE FirstFile = FindFirstFile(folderNameWithSt.c_str(), &FileData);
if (FirstFile != INVALID_HANDLE_VALUE) {
do {
if (strcmp(FileData.cFileName, ".") != 0 && strcmp(FileData.cFileName, "..") != 0)
{
if(FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
std::string NewPath = folderName + FileData.cFileName;
NewPath = NewPath + "\\";
FindAllFiles(NewPath);
}
else
{
std::cout /*<< folderName*/ << FileData.cFileName << std::endl;
}
}
} while(FindNextFile(FirstFile, &FileData));
}
}
这是ASCII版本,请记住文件和文件夹可以用Unicode命名