【问题标题】:find files in whole hard disk [duplicate]在整个硬盘中查找文件[重复]
【发布时间】:2013-08-07 17:43:48
【问题描述】:

我有一个程序可以在特定驱动器中成功搜索特定扩展名的文件(我使用的是 Windows),假设它是“C:\”,然后在控制台上打印这些文件。现在我想概括我的程序。我希望我的程序将在所有分区(驱动器)中搜索..我该怎么做..我应该使用哪个函数..这是我的代码示例

int SearchDirectory(std::vector<std::string> &refvecFiles,
                const std::string        &refcstrRootDirectory,
                const std::string        &refcstrExtension,
                bool                     bSearchSubdirectories = true)
{
  std::string     strFilePath;             // Filepath
  std::string     strPattern;              // Pattern
  std::string     strExtension;            // Extension
  HANDLE          hFile;                   // Handle to file
  WIN32_FIND_DATA FileInformation;         // File information


 strPattern = refcstrRootDirectory + "\\*.*";

  hFile = ::FindFirstFile(strPattern.c_str(), &FileInformation);
  if(hFile != INVALID_HANDLE_VALUE)
  {
    do
    {
      if(FileInformation.cFileName[0] != '.')
      {
        strFilePath.erase();
    strFilePath = refcstrRootDirectory + "\\" + FileInformation.cFileName;

    if(FileInformation.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
    {
      if(bSearchSubdirectories)
      {
        // Search subdirectory
        int iRC = SearchDirectory(refvecFiles,
                                  strFilePath,
                                  refcstrExtension,
                                  bSearchSubdirectories);
        if(iRC)
          return iRC;
      }
    }
    else
    {
      // Check extension
      strExtension = FileInformation.cFileName;
      strExtension = strExtension.substr(strExtension.rfind(".") + 1);

      if(strExtension == refcstrExtension)
      {
        // Save filename
        refvecFiles.push_back(strFilePath);
      }
    }
  }
} while(::FindNextFile(hFile, &FileInformation) == TRUE);

// Close handle
::FindClose(hFile);

DWORD dwError = ::GetLastError();
if(dwError != ERROR_NO_MORE_FILES)
  return dwError;
  }

  return 0;
}


 int main()
{
      int                      iRC         = 0;
  std::vector<std::string> vecAviFiles;
  std::vector<std::string> vecTxtFiles;


  // Search 'c:' for '.avi' files including subdirectories
   iRC = SearchDirectory(vecAviFiles, "c:", "apk");
  if(iRC)
 {
    std::cout << "Error " << iRC << std::endl;
   return -1;
  }

  // Print results
  for(std::vector<std::string>::iterator iterAvi = vecAviFiles.begin();
  iterAvi != vecAviFiles.end();
  ++iterAvi)
std::cout << *iterAvi << std::endl;

  // Search 'c:\textfiles' for '.txt' files excluding subdirectories
  iRC = SearchDirectory(vecTxtFiles, "c:", "txt", false);
  if(iRC)
 {
     std::cout << "Error " << iRC << std::endl;
    return -1;
 }

 // Print results
  for(std::vector<std::string>::iterator iterTxt = vecTxtFiles.begin();
    iterTxt != vecTxtFiles.end();
     ++iterTxt)
     std::cout << *iterTxt << std::endl; 

  // Wait for keystroke
 _getch();

 return 0;
}

【问题讨论】:

  • 问题是什么?
  • 如何迭代所有驱动器以搜索文件。目前我的程序仅在 C:\ 驱动器中搜索,因为我在 SeacrchDirectory 方法()中将其作为参数提供

标签: c++ c winapi


【解决方案1】:

我不是 Windows 程序员,但看起来您必须找出系统中可用的驱动器并为所有驱动器调用您的函数。请参阅此处如何获取 Windows 上的可用驱动器列表:Enumerating all available drive letters in Windows

【讨论】:

  • 您的答案只是指向与此问题相同的问题的链接。您为什么不投票结束作为受骗者,而是选择写一个不提供详细信息且仅链接的答案?
  • 几乎是一样的。为每个驱动器多次调用该函数对我和你来说似乎很明显,但对于提出问题的人来说可能不是。
  • 作为用户之一回答我的问题,我应该使用 GetLogicalDrives 方法返回缓冲区中的所有驱动器号,所以我使用了 char buff[10]=GetLogicalDrives();在我的程序中,但编译器给了我“invalid initializer”错误我现在能做什么?
  • 你没有正确使用它。函数 GetLogicalDrives 返回一个掩码,其中的位表示驱动器的可用性。这是一个如何解码位并打印出驱动器名称的示例:tenouk.com/cpluscodesnippet/getlogicaldrives.html 您需要将其放入字符串(例如 sprintf )并调用您的函数,而不是打印
猜你喜欢
  • 1970-01-01
  • 2013-08-08
  • 2012-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多