【问题标题】:how to search the computer for files and folders如何在计算机中搜索文件和文件夹
【发布时间】:2011-03-22 20:47:16
【问题描述】:

我需要一种方法来在计算机上搜索 Windows 资源管理器等文件。我想让我的程序搜索让我们说硬盘驱动器 c:。我需要它在 C:\ 中搜索文件夹和文件(只是您可以在 c:\ 中看到的那些,然后如果用户单击列表中的文件,例如文件夹 test (C:\test),它将搜索 test 并让用户查看其中包含哪些文件/文件夹。

【问题讨论】:

  • 你的问题是……什么?
  • 这是一个特定于平台的问题。您使用的是 Windows、Unix 等吗?
  • 如果他将他的硬盘驱动器称为C: 并将目录称为“文件夹”,那么他的平台可能是不言而喻的...... ;-) 哦,反斜杠路径分隔符有点给出它也消失了。
  • @TreDubZedd:从C: 被提及的次数来看,我认为Windows 是一个安全的选择。
  • "Windows Explorer" :D 提示提示

标签: c++ windows file


【解决方案1】:

您可以使用 Directory 类成员通过 C# 或托管 C++ 执行此操作。请参阅以下 MSDN 文章:

http://support.microsoft.com/kb/307009

如果你想在 MFC 中使用 C++,你可以使用CFileFind

http://msdn.microsoft.com/en-us/library/f33e1618%28v=VS.80%29.aspx

您必须提供自己的浏览窗口来显示文件系统树。

或者您可以使用目录/文件控件之一为您完成这两项工作。

【讨论】:

  • 使用 .Net 并且需要使用 C++/CLI。
  • @Georg:感谢您的澄清。我添加了其他信息,以防他想在没有 .NET 的情况下使用 C++。
  • @blood:也许点击刷新按钮。我添加了一行关于 CFileFind 和一个指向 MSDN 文档页面的链接。
  • 我做了 >_> 我猜它没有刷新
  • 我不断收到所有代码错误。我似乎没有我需要的标题。我没有mfc :|我认为这可能是您所有代码都无法编译的原因。
【解决方案2】:

这将取决于操作系统。 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. 如果是文件,如果是您要查找的文件,则终止,否则转到下一个文件。

【讨论】:

  • 如何使用 C 或 C++ 获取目录中的文件列表?很好,但我无法工作的代码。只有 Brian R. Bondy 的代码是他的最后一个,但它只能找到我想要的文件的一部分,而且我找不到它是如何工作的,所以我无法为我的程序编辑它:(。
  • 与 dirent 一起玩,看看它是否有效,然后回复你
  • 呃,我无法下载它,但它会解压缩为 .9 文件,仅此而已。我错过了什么,因为我刚刚从你的链接下载了它
  • softagalleria.net/download/dirent/dirent-1.9.zip --- 也许 .9.zip 混淆了您的解压缩程序。我可以在这里看到一个完整的 VC 项目。
  • 该链接上的 VC 项目也有一个演示文件,用于打印目录的内容。
【解决方案3】:

既然你提到了windows,最直接的winapi方法就是使用FindFirstFileFindNextFile函数。

编辑:这是一个示例,向您展示如何枚举目录中的所有文件/文件夹。

#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);

    }

}

【讨论】:

  • 不,两者都找到。它还允许您为查找文件/文件夹提供搜索条件。
  • 这给了我在 CloseHandle() 中的“无效句柄”。您应该改用 FindClose()。
  • @NoAngel 看来你是correct,我编辑了答案。
【解决方案4】:

boost::filesystem 可以是一个跨平台的解决方案(查看其中的此类功能)。

【讨论】:

  • 我真的不想要第三方软件
  • 并不是真正的 3rd 方软件,boost 实际上被 C++ 程序员认为是标准的,但是你似乎不是喜欢使用标准库的人(除了 iostream,它是 C++ 的次优之一功能)。
【解决方案5】:
 #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);

    }

}

【讨论】:

  • 这几乎是一个很好的解决方案,除了: 1. 它主要是在 C 中,但你把 iostream 所以你用 iostream 用 C 编写......如果你想用 C++ 编写,我会最少使用 std::string。您真正的严重错误是您不检查“点”,因此您的点将永远递归(或者更有可能受到此站点名称的影响)。
  • 使用 FindClose() 关闭句柄,使用 FindFirstFile() 打开。 CloseHandle() 将在调试模式下抛出“无效句柄”。
【解决方案6】:

确实没有必要使用 3rd 方库来完成此操作。这是一个简短的独立函数,它列出了目录中的所有文件(及其路径),包括子目录的文件。 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命名

【讨论】:

  • 我只是想知道,你能解释一下与 FindFile 相比有什么好处吗? (顺便说一句,它不应该是 ASCII 或 ANSI 吗?)
猜你喜欢
  • 2012-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-27
  • 1970-01-01
  • 1970-01-01
  • 2013-09-24
  • 1970-01-01
相关资源
最近更新 更多