使用 CFileDialog 接收文件時,文件未保存到用戶選擇的目錄,而是保存到專案目錄下。
// 錯誤代碼
strcpy(StreamFileInfo.szFileTitle, dlg.GetFileName()); // 僅獲取文件名,無路徑
GetFileName() 僅返回文件名(如 test.txt),導致 CFile 以相對路徑創建文件(當前工作目錄)。
// 正確:獲取完整路徑
strcpy(StreamFileInfo.szFileTitle, dlg.GetPathName()); // 返回 "D:\User\Documents\test.txt"
// 或分別獲取
CString fullPath = dlg.GetPathName(); // 完整路徑
CString fileName = dlg.GetFileName(); // 僅文件名
CString folderPath = dlg.GetFolderPath(); // 目錄路徑
CFileDialog dlg(FALSE, NULL, NULL,
OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
_T("所有文件 (*.*)|*.*||"), this);
if (dlg.DoModal() == IDOK) {
CString savePath = dlg.GetPathName(); // 關鍵:完整路徑
CFile myFile(savePath, CFile::modeCreate | CFile::modeWrite | CFile::typeBinary);
// ... 接收數據寫入 myFile ...
myFile.Close();
// 設置文件時間/屬性需用完整路徑
SetFileAttributes(savePath, StreamFileInfo.dwFileAttributes);
}
關於「需不需寫所有文件類型」:
"文本文件 (*.txt)|*.txt|圖片 (*.bmp;*.jpg)|*.bmp;*.jpg|所有文件 (*.*)|*.*||""所有文件 (*.*)|*.*||" 即可| 錯誤用法 | 後果 | 正確用法 |
|---|---|---|
GetFileName() | 相對路徑,保存到工作目錄 | GetPathName() |
未檢查 DoModal() 返回值 | 用戶取消時仍執行保存邏輯 | if (dlg.DoModal() == IDOK) |
| 硬編碼過濾器 | 用戶無法選擇其他類型 | 提供「所有文件」選項 |