MFC 之获取文件路径和文件目录路径
这篇文章我们来介绍一个界面程序中常见的功能,那就是通过点击按钮打开文件浏览对话框,选择对应的文件或者文件夹后,获取其路径,并在编辑中显示出来,当然也会顺带讲一下如果获取当前可执行文件的路径和目录。
一、获取文件路径
首先我们从工具栏中拖拽一个编辑框和按钮控件到主对话框中,并为编辑框添加变量名 m_edit2
:
然后我们点击按钮,跳转到按钮点击事件的处理函数,并编写如下代码:
// 获取文件路径
void CBasicInterfaceConfigDlg::OnBnClickedButton3()
{
// TODO: 在此添加控件通知处理程序代码
CString strFile = L"";
// 创建一个 CFileDialog 对象 dlgFile,用于打开文件选择对话框
CFileDialog dlgFile(TRUE, // TRUE 表示打开文件而不是保存文件
NULL, // 默认文件扩展名, 如果此参数为 NULL,则不附加扩展
NULL, // 显示在 Filename (文件名) 框中的初始文件名,如果为 NULL,则不显示初始文件名
OFN_HIDEREADONLY, // 可用于自定义对话框的一个或多个标志的组合
_T("All Files (*.*)|*.*|Config Files (*.cfg)|*.cfg||"), // 一系列字符串对,用于指定可应用于文件的筛选器
NULL); // 指向文件对话框的父窗口或所有者窗口的指针
// 以模态方式显示文件选择对话框,如果用户选择了文件并点击了“打开”按钮,
// DoModal 会返回 IDOK,否则返回 IDCANCEL
if (dlgFile.DoModal())
{
// 获取用户选择的文件完整路径
strFile = dlgFile.GetPathName();
// 将目录显示在编辑框控件中
m_edit2.SetWindowTextW(strFile.GetString());
}
}
值得注意的是 dlgFile
函数的第五个参数,每个选择项由两部分组成,第一部分是选择项的显示名称,第二部分是实际筛选的后缀名,每个参数之间用 | 符号隔开,最后用两个 || 符号结尾,效果如下:
二、获取文件目录路径
首先我们从工具栏中拖拽一个编辑框和按钮控件到主对话框中,并为编辑框添加变量名 m_edit1
:
然后我们点击按钮,跳转到按钮点击事件的处理函数,并编写如下代码:
// 获取文件目录路径
void CBasicInterfaceConfigDlg::OnBnClickedButton2()
{
// TODO: 在此添加控件通知处理程序代码
WCHAR szPath[MAX_PATH];
ZeroMemory(szPath, sizeof(szPath));
// 定义一个用来配置文件夹浏览对话框的结构体
BROWSEINFO bi;
bi.hwndOwner = this->m_hWnd; // 指定对话框所有者的窗口句柄
bi.pidlRoot = NULL; // 限制了浏览的根目录,NULL表示没有限制
bi.pszDisplayName = szPath; // 用来存放用户选择的文件夹的路径
bi.lpszTitle = L"请选择下载路径:"; // 设置对话框的标题
bi.ulFlags = 0; // 设置对话框的行为标志,0 表示使用默认行为
bi.lpfn = NULL; // 一个回调函数指针,用于处理对话框消息
bi.lParam = 0; // 传递给回调函数的用户定义的值
bi.iImage = 0; // 指定对话框中文件夹图标的索引
// 弹出目录对话框
LPITEMIDLIST lp = SHBrowseForFolder(&bi);
if (lp && SHGetPathFromIDList(lp, szPath))
{
// 将目录显示在编辑框控件中
m_edit1.SetWindowTextW(szPath);
}
}
其实不难,通过一个结构体存储配置文件夹浏览对话框,弹出目录对话框进行选择即可得到文件的路径,选中后效果如下:
三、获取可执行文件当前路径
// 获取可执行文件的当前所在路径
void CBasicInterfaceConfigDlg::OnBnClickedButton4()
{
// TODO: 在此添加控件通知处理程序代码
TCHAR szPath[MAX_PATH];
if (GetModuleFileName(NULL, szPath, MAX_PATH))
{
// 将可执行文件的当前路径显示在编辑框控件中
m_edit4.SetWindowTextW(szPath);
}
}
四、获取可执行文件当前所在目录
// 获取可执行文件的当前所在目录
void CBasicInterfaceConfigDlg::OnBnClickedButton5()
{
// TODO: 在此添加控件通知处理程序代码
TCHAR szPath[MAX_PATH];
if (GetCurrentDirectory(MAX_PATH, szPath))
{
// 将可执行文件的当前目录显示在编辑框控件中
m_edit3.SetWindowTextW(szPath);
}
}