在調用 GetOpenFileName 和 GetSaveFileName 後恢復程序當前工作目錄
[編輯] [转简体] (简体译文)
|
作者:huidong
| 分類:【編程】Win32
解決方案
[
24 瀏覽
0 評論
11 贊
11 踩
]
概要
調用 Win API 提供的文件選擇器後,程序當前工作目錄會被修改到最後一次所選文件的目錄。本文提供恢復程序目錄的方法。
正文
解決方案
使用 SetCurrentDirectory 函數,將程序目錄改回先前的工作目錄。
只需要在調用 GetOpenFileName 和 GetSaveFileName 函數前,先保存下當前的程序目錄,然後使用 SetCurrentDirectory 函數將程序當前工作目錄改回先前的目錄。
示例代碼
#include <windows.h> // 提供 GetOpenFileName 等 API #include <stdio.h> // 提供 printf #include <tchar.h> // 提供 _wgetcwd int main(int argc, char* argv[]) { printf("argv[0]:\t%s\n", argv[0]); // 輸出:argv[0]: E:\TempProject\x64\Debug\CodeTest_Project.exe // 說明 argv[0] 存儲的是包含程序名的完全路徑 wchar_t pwszOldPath[MAX_PATH] = { 0 }; _wgetcwd(pwszOldPath, MAX_PATH); wprintf(L"_wgetcwd:\t%ls\n", pwszOldPath); // 輸出:_wgetcwd: E:\TempProject // 此處調用 _wgetcwd 以獲取程序當前工作目錄的完整路徑 // 由於使用 VS 進行調試,所以程序的工作目錄在項目目錄下,而非程序目錄下 // 此處調用 GetOpenFileName 選擇一張其他目錄的圖片文件 TCHAR pszPath[MAX_PATH] = { 0 }; OPENFILENAME filename = { 0 }; filename.lStructSize = sizeof(filename); filename.lpstrFile = pszPath; filename.nMaxFile = sizeof(pszPath) / sizeof(*pszPath); filename.lpstrFilter = L"PNG(*.png)\0*.png\0\0"; filename.Flags = OFN_EXPLORER; GetOpenFileName(&filename); wprintf(L"pszPath:\t%ls\n", pszPath); // 輸出:pszPath: C:\Users\myname\Pictures\test.png wchar_t pwszNewPath[MAX_PATH] = { 0 }; _wgetcwd(pwszNewPath, MAX_PATH); wprintf(L"_wgetcwd:\t%ls\n", pwszNewPath); // 輸出:_wgetcwd: C:\Users\myname\Pictures // 證明讀取圖片文件後,程序工作目錄發生了變化,移動到了剛剛選取的文件所在目錄 // 現在將目錄設置回先前保存的目錄 SetCurrentDirectory(pwszOldPath); wchar_t pwszFinalPath[MAX_PATH] = { 0 }; _wgetcwd(pwszFinalPath, MAX_PATH); wprintf(L"_wgetcwd:\t%ls\n", pwszFinalPath); // 輸出:_wgetcwd: E:\TempProject // 證明程序目錄恢復成功 // 備註: // 在 VS 中調試時,這樣是將工作目錄設置回了項目目錄 // 如果想要設置工作目錄爲程序目錄,則需要使用 argv[0] 提供的完整程序路徑,代碼略 return 0; }
備註
關於 _wgetcwd 函數,參見 MSDN https://learn.microsoft.com/zh-cn/cpp/c-runtime-library/reference/getcwd-wgetcwd?view=msvc-170
若拖動一個文件到程序圖標上,以這種方式啓動程序,那麼程序的工作目錄也會相應地變化到該文件所在的目錄。在這種情況下,使用 argv[0] 獲取程序的真實路徑。
參考
https://blog.csdn.net/qiuchangyong/article/details/8164668?utm_source=blogxgwz9