65.9K
CodeProject 正在变化。 阅读更多。
Home

如何浏览文件夹

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.88/5 (19投票s)

2006 年 2 月 16 日

1分钟阅读

viewsIcon

237177

downloadIcon

2933

本文提供了一个“剪切-粘贴”解决方案,用于获取目录的路径。

引言

本文提供了一个简洁明了的“剪切-粘贴”解决方案,用于解决浏览文件夹这一由来已久的问题。 市面上有很多类提供了更多的自定义选项和大量的功能,但我相信多一个示例也不会有坏处。

何时使用此解决方案

与此处的一些其他方法相比,此方法的优势在于它直接包装了 SHBrowseForFolder 函数。 因此,您可以在不使用 MFC 的控制台应用程序中使用它,例如单元测试应用程序,这些应用程序可以从不硬编码测试结果的输出位置中受益。

简而言之,如果您正在寻找赏心悦目的界面,请查看 XFolderDialog 或此处的一些其他文件夹对话框。 否则,请继续阅读。

使用代码

要使用此代码,您需要包含以下标准文件

#include "shlobj.h"
#include <string>

GetFolder 函数

Params

  • folderpath - 一个引用,指向一个字符串,如果成功,该字符串将包含文件夹路径。
  • szCaption - 对话框的可选消息。
  • hOwner - 父窗口的可选句柄。

Returns

  • true 如果成功,false 如果取消或发生错误。
bool GetFolder(std::string& folderpath, 
               const char* szCaption = NULL, 
               HWND hOwner = NULL)
{
   bool retVal = false;

   // The BROWSEINFO struct tells the shell 
   // how it should display the dialog.
   BROWSEINFO bi;
   memset(&bi, 0, sizeof(bi));

   bi.ulFlags   = BIF_USENEWUI;
   bi.hwndOwner = hOwner;
   bi.lpszTitle = szCaption;

   // must call this if using BIF_USENEWUI
   ::OleInitialize(NULL);

   // Show the dialog and get the itemIDList for the 
   // selected folder.
   LPITEMIDLIST pIDL = ::SHBrowseForFolder(&bi);

   if(pIDL != NULL)
   {
      // Create a buffer to store the path, then 
      // get the path.
      char buffer[_MAX_PATH] = {'\0'};
      if(::SHGetPathFromIDList(pIDL, buffer) != 0)
      {
         // Set the string value.
         folderpath = buffer;
         retVal = true;
      }

      // free the item id list
      CoTaskMemFree(pIDL);
   }

   ::OleUninitialize();

   return retVal;
}

结论

好吧,这就是它的全部。 如果这段代码能为这里的哪怕一个人节省时间,那么花费的几分钟时间就值得了。 享受吧!

© . All rights reserved.