匯東網


在調用 GetOpenFileName 和 GetSaveFileName 後恢復程序當前工作目錄

[編輯] [转简体]
|
作者:huidong | 分類:【編程】Win32
[ 14 瀏覽 0 評論 3 贊 3 踩 ]

概要
調用 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;
}

備註

  1. 關於 _wgetcwd 函數,參見 MSDN https://learn.microsoft.com/zh-cn/cpp/c-runtime-library/reference/getcwd-wgetcwd?view=msvc-170 

  2. 若拖動一個文件到程序圖標上,以這種方式啓動程序,那麼程序的工作目錄也會相應地變化到該文件所在的目錄。在這種情況下,使用 argv[0] 獲取程序的真實路徑。

參考

https://blog.csdn.net/qiuchangyong/article/details/8164668?utm_source=blogxgwz9 

[ 3] [ 3]


 評論區  0 條評論

+ 添加評論