【问题标题】:find list of files in a directory programmatically C++ MFC以编程方式查找目录中的文件列表 C++ MFC
【发布时间】:2016-12-01 09:11:13
【问题描述】:

我正在尝试以编程方式查找目录中的文件列表,并且我编写了以下代码

CStringArray CCL2ProjectDirectoryPage::GetAllFilesNames()
{
  WIN32_FIND_DATA fileData;
  memset(&fileData, 0, sizeof(WIN32_FIND_DATA));
  HANDLE handle = FindFirstFile("d:\\test\\*", &fileData);

  CStringArray strArray;

  while(handle != INVALID_HANDLE_VALUE)
  {
    strArray.Add(fileData.cFileName); // the problem is that the fileData.cFileName always contains "."

    if(FALSE == FindNextFile(handle, &fileData))
    break;
  }
  FindClose(handle);

  return strArray;
}

问题是fileData.cFileName 总是包含“.”。 “。”第一个文件,“..”第二个文件,依此类推。 这段代码有什么问题? 提前致谢。

【问题讨论】:

  • 您的代码没有问题。文件名“。”和“..”是正常的,你只需要忽略它们。
  • 它们是目录名,而不是文件名,你不能指望它们存在 - 根目录没有..。但我承认,他们报告这些是微软方面的懒惰。
  • 其实“。”表示“当前目录”,“..”表示“父目录”。 FindFileNext 报告这些是完全没用的,可能只是出于与老式 Windows 版本的兼容性原因。
  • 谢谢@MichaelWalz

标签: c++ winapi mfc


【解决方案1】:

您的代码仅使用 Win32 API 来遍历目录/文件夹。 MFC 执行此操作的方式要简单得多。该框架带有CFileFind,它更易于使用。您也不能返回CStringArray,因为它没有复制构造函数。您应该使用 CStringArray 引用作为方法的输出参数

void CCL2ProjectDirectoryPage::GetAllFilesNames(CStringArray& files)
{
    CFileFind finder;
    // start working for files
    BOOL bWorking = finder.FindFile(_T("d:\\test\\*"));
    while (bWorking)
    {
        bWorking = finder.FindNextFile();

        // skip . and .. files
        if (!finder.IsDots())
        {
            files.Add(finder.GetFileName());
        }
    }

}

【讨论】:

    【解决方案2】:

    你想要这个:

    CStringArray GetAllFilesNames()
    {
      WIN32_FIND_DATA fileData;
      memset(&fileData, 0, sizeof(WIN32_FIND_DATA));
      HANDLE handle = FindFirstFile("d:\\test\\*", &fileData);
      CStringArray strArray;
    
      if (handle != INVALID_HANDLE_VALUE)
      {
        do
        {
          if (_tcscmp(fileData.cFileName, _T(".")) != 0 && // ignore "." and ".."
            _tcscmp(fileData.cFileName, _T("..")) != 0)
          {
            strArray.Add(fileData.cFileName);
          }
        } while (FindNextFile(handle, &fileData));
    
        FindClose(handle);
      }
    
      return strArray;
    }
    

    免责声明:这是未经测试的最小错误检查代码,仅用于演示目的。

    【讨论】:

    • CStringArray 是否带有复制构造函数?
    • @AndrewKomiagin 好问题,但是 OP 假装他的代码有效。
    • 由于 OP 只要求提供“文件列表”,因此循环应该忽略在 fileData.dwFileAttributes 字段中启用了 FILE_FLAG_DIRECTORY 标志的条目。
    猜你喜欢
    • 1970-01-01
    • 2011-09-13
    • 2011-08-23
    • 2017-04-27
    • 2011-09-28
    • 1970-01-01
    • 2018-12-11
    • 2014-11-10
    • 1970-01-01
    相关资源
    最近更新 更多