【问题标题】:MFC, Find specific file TypesMFC,查找特定文件类型
【发布时间】:2017-07-18 14:43:54
【问题描述】:

我有一种方法可以打开保存的设置文件(单击文件->打开时),我试图在打开另一组文件时自动打开文件。

为此,我想计算一个文件夹中有多少特定类型的文件,以确保只有 1 个。 文件夹中还会有其他文件类型,所以我需要一种方法来绕过它们。

我已经有了文件夹的路径,但是有没有简单的方法来搜索文件类型?也许甚至得到他们的名字?

我对 MFC 还是很陌生,而且年纪大了,在我想要的特定领域找不到太多帮助。 谢谢!

编辑(澄清) - 例如,假设我有一个包含 3 个 word 文档和一个文本文件的文件夹。我希望它能够搜索文件夹并说有 3 个文件是 .docx 或 1 个文件是 .txt(取决于我告诉它搜索的内容)。如果我可以保存找到的文件之一的名称,那就太好了。

【问题讨论】:

  • 您的问题不清楚。你在找this吗?
  • 不,很遗憾,我不需要列出它们,只需搜索它们。假设我有一个包含 3 个 word 文档和一个文本文件的文件夹。我希望它能够搜索文件夹并说有 3 个文件是 .docx 或 1 个文件是 .txt。如果我可以保存找到的文件之一的名称,那就太好了。
  • 你觉得列出文件和搜索文件有什么区别?
  • @ReddestHorse 所以你实际上想要列出它们。

标签: c++ mfc


【解决方案1】:

我希望用 CFileFind 解决它。 下面是一个使用 CFileFind 的示例。

CFileFind finder;
static const TCHAR szFileToFind[] = _T("C:\\WINDOWS\\SYSTEM.INI");

BOOL bResult = finder.FindFile(szFileToFind);

if (bResult)
{
    finder.FindNextFile();

    TRACE(_T("Root of %s is %s\n"), szFileToFind, (LPCTSTR)finder.GetRoot());

    TRACE(_T("Title of %s is %s\n"), szFileToFind,(LPCTSTR)finder.GetFileTitle());

    TRACE(_T("Path of %s is %s\n"), szFileToFind, (LPCTSTR)finder.GetFilePath());

    TRACE(_T("URL of %s is %s\n"), szFileToFind, (LPCTSTR)finder.GetFileURL());

    TRACE(_T("Name of %s is %s\n"), szFileToFind, (LPCTSTR)finder.GetFileName());

    finder.Close();
}
else
{
    TRACE(_T("You have no %s file.\n"), szFileToFind);
}

【讨论】:

    【解决方案2】:

    根据 gwangsoo 所说,我将 CFileFind 与 GetFilePath 和 GetFileName 一起使用。

    但是,我从How to get list of files in a directory programmatically 上的答案中学到了很多东西。我的不同之处还包括实现 CFileFind(使其相当重复且效率低下,但它有效),以便在查找所需文件类型的子字符串时可以使用 CString 而不是 tchar。

    CFileFind finder;
    CString find;
    find = ".txt";
    finder.FindFile(stored_path+"\\*");
    WIN32_FIND_DATA search_data;
    memset(&search_data, 0, sizeof(WIN32_FIND_DATA));
    HANDLE handle = FindFirstFile(stored_path+"\\*", &search_data);
    while(handle != INVALID_HANDLE_VALUE)
    {
       finder.FindNextFile();
       if (finder.GetFileName().Find (find) != -1)
       {
          save_count++;
          if (save_count == 1)
          {
             save_name = finder.GetFileName();
             save_path = finder.GetFilePath();
          }
       }
       if(FindNextFile(handle, &search_data) == False )
          break;
    }
    

    我还包括了第四行 finder.FindFile(stored_pa​​th+"\*"); 作为进入我当前保存的文件夹(作为存储路径)的一种方式。

    感谢大家的帮助!

    【讨论】:

      猜你喜欢
      • 2015-01-07
      • 2014-04-09
      • 2019-08-11
      • 1970-01-01
      • 2012-09-21
      • 1970-01-01
      • 2023-01-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多