首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

MFC CFileDialog 另存為文件路徑獲取錯誤:GetFileName vs GetPathName

     編輯:程式設計綜合問答

問題現象

使用 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)
硬編碼過濾器用戶無法選擇其他類型提供「所有文件」選項
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved