如何在计算机中搜索文件和文件夹

时间:2010-07-29 17:08:21

标签: c++ windows file

我需要一种在计算机上搜索Windows资源管理器等文件的方法。我希望我的程序搜索让我们说硬盘c:。我需要它来搜索C:\中的文件夹和文件(只是你可以在c:\中看到的那些,那么如果用户点击列表上的文件,比如文件夹测试(C:\ test),它会搜索测试并让用户可以看到其中的文件/文件夹。

6 个答案:

答案 0 :(得分:14)

由于您提到了窗口,因此使用FindFirstFileFindNextFile功能的最直接的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,其中每个文件都是叶节点,每个子目录都是一个内部节点。

所以你要做的就是,

  1. 使用以下功能获取目录中的文件/文件夹列表:
    void getFilesFolders(vector<string> & dir_list, const string & folder_name)
  2. 如果是目录,请转到1,目录名称为
  3. 如果是文件,请终止,如果它是您要查找的文件,否则转到下一个文件。

答案 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命名