Edit1编辑框绑定变量,初始化内容
m_EditCtrl = L"D:
添加List控件,属性设置report,OnInitDialog()函数里添加信息
// 初始化函数 BOOL CFileManagerDlg::OnInitDialog() { CDialog::OnInitDialog(); // 初始化列表控件的风格 m_ListCtrl.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES); // 初始化列表控件的列选项 m_ListCtrl.InsertColumn(0, L"文件名", LVCFMT_CENTER, 200); m_ListCtrl.InsertColumn(1, L"修改时间", LVCFMT_CENTER, 150); m_ListCtrl.InsertColumn(2, L"类型", LVCFMT_CENTER, 140); m_ListCtrl.InsertColumn(3, L"大小", LVCFMT_CENTER, 100); // 默认遍历 D 盘的内容 GetFileInfo(m_EditCtrl); return 0; }
上面用到的相关函数
// 获取文件夹下的所有文件和目录 void CFileManagerDlg::GetFileInfo(CString FilePath) { // 1. 清空列表中已存在的数据 m_ListCtrl.DeleteAllItems(); // 2. 定义需要的数据 WIN32_FIND_DATA FileInfo = { 0 }; // 3. 拼接路径为 D:\* = FilePath + L"\*"; 并且获取第一个文件 HANDLE FindHanlde = FindFirstFile(FilePath + L"\*", &FileInfo); // 4. 判断文件是否获取成功,并继续遍历 if (INVALID_HANDLE_VALUE != FindHanlde) { do { // 5. 添加数据到列表中时,排除 . 目录 if (_tcscmp(FileInfo.cFileName, L".")) { // 6. 向列表内添加数据 InsetFileInfo(FileInfo); } // 7. 遍历下一个文件 } while (FindNextFile(FindHanlde, &FileInfo)); } } // 向列表中添加数据 void CFileManagerDlg::InsetFileInfo(WIN32_FIND_DATA& FileInfo) { CString TempString; // 0. 获取当前列表最后一个位置 int Count = m_ListCtrl.GetItemCount(); // 1. 在列表中添加一行名称 m_ListCtrl.InsertItem(Count, FileInfo.cFileName); // 2. 添加修改时间 FILETIME LocalFileTime = { 0 }; FileTimeToLocalFileTime(&FileInfo.ftLastWriteTime, &LocalFileTime); SYSTEMTIME SystemTime = { 0 }; FileTimeToSystemTime(&LocalFileTime, &SystemTime); TempString.Format(L"%d/%d/%d/%d:%d:%d", SystemTime.wYear, SystemTime.wMonth, SystemTime.wDay, SystemTime.wHour, SystemTime.wMinute, SystemTime.wSecond); m_ListCtrl.SetItemText(Count, 1, TempString); // 3. 添加类型,属性 TempString = L""; if (FileInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) TempString += L"目录 "; else TempString += L"文件 "; if (FileInfo.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) TempString += L"隐藏 "; m_ListCtrl.SetItemText(Count, 2, TempString); // 4. 根据类型进行大小的计算 if (FileInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) m_ListCtrl.SetItemText(Count, 3, L"-"); else { TempString.Format(L"%.2lf MB", FileInfo.nFileSizeLow / 1024.0 / 1024.0); m_ListCtrl.SetItemText(Count, 3, TempString); } }
选择文件左键双击进入下个文件
// 左键双击的点击 void CFileManagerDlg::OnDblclkList1(NMHDR* pNMHDR, LRESULT* pResult) { LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR); // 获取当前的路径,保存编辑框中 UpdateData(TRUE); // 1. 拼接点击的到的文件或目录对应的全路径 CString FilePath = m_EditCtrl + L"\" + m_ListCtrl.GetItemText(pNMItemActivate->iItem, 0); // 2. 判断是不是一个目录 if (GetFileAttributes(FilePath) & FILE_ATTRIBUTE_DIRECTORY) { // 3. 如果是目录就继续遍历 GetFileInfo(FilePath); // 4. 更新当前所在的路径 WCHAR * Name = nullptr; GetFullPathName(FilePath.GetBuffer(), MAX_PATH, m_EditCtrl.GetBuffer(MAX_PATH), &Name); UpdateData(FALSE); } *pResult = 0; }
在文件上右键弹出文件相关信息
void CFileManagerDlg::OnRclickList1(NMHDR* pNMHDR, LRESULT* pResult) { LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR); // 拼接路径并传入到构造函数中 UpdateData(TRUE); ////////////////////////////////////////////////////////// CString FilePath = m_EditCtrl + L"\" + m_ListCtrl.GetItemText(pNMItemActivate->iItem, 0); ////////////////////////////////////////////////////////// // 弹出对话框 CMyFileDialog Dialog(FilePath); Dialog.DoModal(); *pResult = 0; }
弹出窗口构造函数重载
CMyFileDialog::CMyFileDialog(CString FileName, CWnd* pParent /*=nullptr*/) : CDialogEx(IDD_FILEDIALOG, pParent) { GetFullPathName(FileName.GetBuffer(), MAX_PATH, m_FileName.GetBuffer(MAX_PATH), &Name); }
弹出窗口初始化
// 初始化对话框,显示数据 BOOL CMyFileDialog::OnInitDialog() { CDialogEx::OnInitDialog(); // 创建结构体用于保存文件内容 SHFILEINFO FileInfo = { 0 }; // 获取类型 SHGetFileInfo(m_FileName, 0, &FileInfo, sizeof(SHFILEINFO), SHGFI_TYPENAME); SetDlgItemText(IDC_EDIT2, FileInfo.szTypeName); // 获取图标 SHGetFileInfo(m_FileName, 0, &FileInfo, sizeof(SHFILEINFO), SHGFI_ICON); SendDlgItemMessage(IDC_STATIC1, STM_SETICON, (WPARAM)FileInfo.hIcon, NULL); // 输出名字 SetDlgItemText(IDC_EDIT1, Name); // 设置对话框内的属性 int attr = GetFileAttributes(m_FileName); if (attr & FILE_ATTRIBUTE_HIDDEN) SendDlgItemMessage(IDC_CHECK2, BM_SETCHECK, BST_CHECKED); if (attr & FILE_ATTRIBUTE_READONLY) SendDlgItemMessage(IDC_CHECK1, BM_SETCHECK, BST_CHECKED); return TRUE; }
弹出窗口确认按钮更改复选框对应的属性应用到文件夹上
// 应用设置
void CMyFileDialog::OnBnClickedButton2()
{
// 获取默认的属性
int attr = GetFileAttributes(m_FileName);
if (SendDlgItemMessage(IDC_CHECK2, BM_GETCHECK) == BST_CHECKED)
attr |= FILE_ATTRIBUTE_HIDDEN;
else
attr &= ~FILE_ATTRIBUTE_HIDDEN;
if (SendDlgItemMessage(IDC_CHECK1, BM_GETCHECK) == BST_CHECKED)
attr |= FILE_ATTRIBUTE_READONLY;
else
attr &= ~FILE_ATTRIBUTE_READONLY;
// 设置修改后的属性
SetFileAttributes(m_FileName, attr);
CDialogEx::OnOK();
}
知识点
_tcscmp应用
// 5. 添加数据到列表中时,排除 . 目录
if (_tcscmp(FileInfo.cFileName, L"."))
{
// 6. 向列表内添加数据
InsetFileInfo(FileInfo);
}
GetFullPathName 消除重复的路径
GetFullPathName(FilePath.GetBuffer(), MAX_PATH, m_EditCtrl.GetBuffer(MAX_PATH), &Name);
SHFILEINFO 结构体
// 创建结构体用于保存文件内容 SHFILEINFO FileInfo = { 0 }; // 获取类型 SHGetFileInfo(m_FileName, 0, &FileInfo, sizeof(SHFILEINFO), SHGFI_TYPENAME); SetDlgItemText(IDC_EDIT2, FileInfo.szTypeName);