MFC文件框操作
一 选择文件夹
/*
typedef struct _browseinfoW {
HWND hwndOwner; //对话框的所有者窗口的句柄。
PCIDLIST_ABSOLUTE pidlRoot;
/*
一个 PIDL,指定要从中开始浏览的根文件夹的位置。
对话框中仅显示命名空间层次结构中的指定文件夹及其子文件夹。
此成员可以为 NULL;在这种情况下,将使用默认位置。
*/
LPWSTR pszDisplayName;
/*
指向缓冲区的指针,用于接收用户选择的文件夹的显示名称。
假定此缓冲区的大小为MAX_PATH个字符。
#define MAX_PATH 260
*/
LPCWSTR lpszTitle;
/*
指向以 null 结尾的字符串的指针,该字符串显示在对话框中的树视图控件上方。
此字符串可用于向用户指定指令。
*/
UINT ulFlags;
/*指定对话框选项的标志。
此成员可以是 0,也可以是以下值的组合。
版本号是指 SHBrowseForFolder 识别在更高版本中添加的标志所需的最低版本 Shell32.dll。
有关详细信息 ,请参阅 Shell 和公共控件版本 。
BIF_RETURNONLYFSDIRS (0x00000001)
0x00000001。 仅返回文件系统目录。 如果用户选择不属于文件系统的文件夹,“ 确定” 按钮将灰显。
BIF_DONTGOBELOWDOMAIN (0x00000002)
0x00000002。 不要在对话框的树视图控件中包含域级别以下的网络文件夹。
BIF_NEWDIALOGSTYLE (0x00000040)
0x00000040。 版本 5.0。 使用新的用户界面。 设置此标志为用户提供了可以调整大小的较大对话
框。对话框具有多个新功能,包括:对话框中的拖放功能、重新排序、快捷菜单、新文件夹、删除和其他
快捷 菜单命令。
*/
BFFCALLBACK lpfn;
/*指向发生事件时对话框调用的应用程序定义函数的指针。
有关详细信息,请参阅 BrowseCallbackProc 函数。 此成员可以为 NULL。
*/
LPARAM lParam;
/*
一个应用程序定义的值,对话框将传递给回调函数(如果在 lpfn 中指定了一个值)。
*/
int iImage;
/*
一个整数值,用于接收与所选文件夹关联的图像的索引,存储在系统映像列表中
*/
} BROWSEINFOW, *PBROWSEINFOW, *LPBROWSEINFOW;
#define BROWSEINFO BROWSEINFOW
*/
BROWSEINFO bi; //包含 SHBrowseForFolder 函数的参数,并接收有关用户选择的文件夹的信息
bi.hwndOwner = NULL; //调用窗口句柄设置为空,即没有句柄
bi.pidlRoot = CSIDL_DESKTOP;//文件夹的根目录,此处为桌面
bi.pszDisplayName = NULL;//文件夹名称设置为空
bi.lpszTitle = NULL;//显示位于对话框左上部的提示信息
bi.ulFlags = BIF_DONTGOBELOWDOMAIN | BIF_RETURNONLYFSDIRS | BIF_NEWDIALOGSTYLE;//有新建文件夹按钮
bi.lpfn = NULL;
bi.iImage = 0;
LPITEMIDLIST pidl = SHBrowseForFolder(&bi);//调用选择对话框
if (pidl == NULL) //对象为空
{
return;//关闭文件夹对话框
}
TCHAR strFolder[MAX_PATH];
SHGetPathFromIDList(pidl, strFolder);//将用户选择文件夹信息放到缓冲区中
//GetDlgItem(IDC_EDIT3)->SetWindowText(strFolder);//根据需要将文件夹路径显示在MFC控件上
二 遍历文件夹中的子文件夹名
#include <io.h>
CString temp;
_finddata64i32_t fileInfo;
intptr_t hFile = _findfirst("D:\\*", &fileInfo);
/*以遍历D盘下的所有文件夹名为例 D:\\* 注意*表示全部 不能漏了 */
if (hFile == -1) {
return ;
}
do
{ //根据需要对每个文件夹名做出操作
......
/*
string tmp = fileInfo.name;
temp=tmp.c_str();
pDlg->MessageBox(temp, _T("文件信息"), MB_OK);
*/
} while (_findnext(hFile, &fileInfo) == 0);
三 遍历文件夹下有的文件
#include <vector>
#include <string>
#include <io.h>
vector<string> files;//存储文件路径
intptr_t file_handle = 0;
struct _finddata_t file_info;
string temp,tmp1,tmp3,tmp4;
CString tmp2;
string folderName_str="D:\\";//以遍历D盘下的文件为例
if ((file_handle = _findfirst(temp.assign(folderName_str).append("/*").c_str(), &file_info)) != -1)//assgin 字符串直接赋值 遍历寻找所有文件,所以后缀是/* 要是指定的文件就是 /*.指定后缀名
{
do
{ //文件名已被存入file_info中
files.push_back(temp.assign(folderName_str).append("\\").append(file_info.name));
} while (_findnext(file_handle, &file_info) == 0); //遍历下一个成功
_findclose(file_handle); //遍历结束,关闭文件夹句柄
}
四 打开文件对话框 获取选择的文件名
CString filter;
filter = "All Files (*.*)|*.*||"; //文件过滤器
CFileDialog dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY, filter);
CString str;
if (dlg.DoModal() == IDOK)
{
str = dlg.GetPathName(); //获取文件名
//MessageBox(str);
}
USES_CONVERSION; //组件使用
CStringA stra(str);//CString转string
string imagename = stra.GetBuffer();
stra.ReleaseBuffer();
数据类型转换
一 : CString 转 string
//多字节编码
CString test= "test";
std::string str = test.GetBuffer();
//unicode编码
//方法一
CString test=L"helloworld";
USES_CONVERSION; //组件使用
CStringA stra(str);//CString转string
string imagename = stra.GetBuffer();
stra.ReleaseBuffer(); //注意要释放资源
//方法二
USES_CONVERSION; //组件使用
//CT2A其实就是CW2A就是将Unicode转换为多字符集ASCII,也可写成CW2A
std::string str = CT2A(test.GetString());
//str=CW2A(test.GetString())
//方法三
CString strData = _T("test");
std::string strTempData = (CStringA)strData;
二: string 转 CString
//不存在string到CString的构造函数,所以只能先声明CString变量再赋值
CString cstr;
string str="123";
cstr=str.c_str();
//或者format函数
cstr.Format(L"%s",strStr.c_str() );
三:CString 转 char *
CString cstr=L"test";
//方法一 直接转换
char *p =(LPSTR)(LPCTSTR)cstr;
//方法二 间接转换 CString->string->char*
//转化为string的方法如上
char* pstr=string.c_str();
四: char* 转 CString
//format
CString cstr;
char *pstr="test";
cstr.Format("%s",pstr);
五: char * 转 string
//方法一 构造
char *pstr="test";
string str(pstr);
//方法二 赋值
string str=pstr;