选择文件或者文件夹处理函数

来源:互联网 发布:windows多线程互斥 编辑:程序博客网 时间:2024/06/05 03:59

写代码时经常会遇到,如点击按钮选择文件或者文件夹路径的操作,网上搜集了这方面的函数,以供后续使用。

1,获取文件夹路径:

BROWSEINFO的结构如下:
typedef struct _browseinfo {
    HWND hwndOwner;       
     // 父窗口句柄
  LPCITEMIDLIST pidlRoot;             
   // 要显示的文件夾的根(Root)
    LPTSTR pszDisplayName;
   // 保存被选取的文件夾路径的缓冲区
  LPCTSTR lpszTitle;           
   // 显示位于对话框左上部的标题
  UINT ulFlags;             
  // 指定对话框的外观和功能的標志
 BFFCALLBACK lpfn;                   
  // 处理事件的回调函数
 LPARAM lParam;              
 // 应用程序传给回调函数的参数
 int iImage;              
 // 保存被选取的文件夾的图片索引
 
} BROWSEINFO, *PBROWSEINFO, *LPBROWSEINFO

各个参数的含义可参考MSDN;


 实例部分代码:
 char szPath[256];
 BROWSEINFO bi;
 LPITEMIDLIST pIDL;
 bi.hwndOwner = m_hWnd;//一般通过GetSafeHwnd()函数获取,记不清是不是
 bi.pidlRoot = NULL;
 bi.pszDisplayName = szPath;
 bi.lpszTitle = m_strTitle;
 bi.ulFlags = BIF_RETURNONLYFSDIRS;
 bi.lpfn = NULL;
 bi.lParam = 0;
 bi.iImage = 0;

 if(pIDL = SHBrowseForFolder( &bi ))
 {
   if (pIDL != NULL)
   {
 if(SHGetPathFromIDList(pIDL,szPath))
  {
    m_sMapPath = szPath;
    UpdateData(FALSE);
  }
    }
  }

 

2,获取文件路径:


使用CFileDialog类并设置OFN_ALLOWMULTISELECT标志时,OPENFILENAME结构体的lpstrFile成员是一个指向用户申请分配的缓冲区,里面接受所选的路径和文件名列表,这个列表的每一项由一个NULL隔开,最末以两个NULL结束。nMaxFile成员指明了缓冲区的大小,如果所选择的文件名的加起来的总长度超过了此值,则DoModal函数返回IDCANCEL,如果用户试图打开超过缓冲区大小的文件集的话,CommDlgExtendedError()将返回FNERR_BUFFERTOOSMALL,这时候,lpstrFile的前两个byte将会包含实际需要的缓冲区的字节数。  
如果是在Windows NT 4.0下,能被拷贝到lpstrFile缓冲区的字节数被限制在2562字节以内,如果超过将被截断。 

CFileDialog类具体的参数可以参考MSDN的构造函数说明。
实例部分代码如下

#include "cderr.h" //for definition of FNERR_BUFFERTOOSMALL

CFileDialog dlg(TRUE, NULL, NULL, OFN_ALLOWMULTISELECT, NULL, NULL);
DWORD MAXFILE = 4000
dlg.m_ofn.nMaxFile = MAXFILE;
char* pc = new char[MAXFILE];
dlg.m_ofn.lpstrFile = pc;
dlg.m_ofn.lpstrFile[0] = NULL;

int iReturn = dlg.DoModal();
if(iReturn == IDOK)
{
    int nCount = 0;
    POSITION pos = dlg.GetStartPosition();
    while (pos != NULL)
    {
        dlg.GetNextPathName(pos);
        nCount++;
    }
    CString str;
    str.Format("Successfully opened %d files ", nCount);
    AfxMessageBox(str);
}
else if(iReturn == IDCANCEL)
    AfxMessageBox("Cancel");

if(CommDlgExtendedError() == FNERR_BUFFERTOOSMALL)
    AfxMessageBox("BUFFERTOOSMALL");
delete []pc;

 

 

0 0