2016-12-20 112 views
0

在調用GetOpenFileName之後,進程的當前目錄更改爲文件打開文件的目錄GetOpenFileName爲什麼當前目錄更改


我該如何保持默認的當前目錄?

+2

通過保存它,然後還原它,一旦調用返回。雖然這可以回答你的問題,但是你真正應該做的事情並不是完全依賴於當前的工作目錄。你剛剛經歷了一個原因,爲什麼。 – IInspectable

+0

我需要在本地目錄中快速創建文件,因爲來自同一目錄的另一個程序只能打開本地文件,這就是兩個程序之間相互通信的方式。謝謝你的方式。 – Malina

+1

那麼,繼續創建你需要的所有文件。爲什麼堅持,這需要依靠當前的工作目錄,儘管? – IInspectable

回答

2

我該如何保持默認的當前目錄?

如果你讀了OPENFILENAME documentation,存在對確切目的的OFN_NOCHANGEDIR標誌:

,恢復當前目錄到其原始值,如果用戶改變了目錄,而搜索文件。

儘管文檔聲明,該標誌在GetOpenFileName()支持。

也看到在這個問題上Raymond Chen的博客文章:

Why does the common file dialog change the current directory?

+1

呵呵。該文件說,該標誌會導致當前目錄恢復到其原始值,但雷蒙德的文章說,它會阻止當前目錄被更改;你真的知道實際上發生了什麼嗎? (當然,這對單線程程序無關緊要。) –

+0

我閱讀文章,我不復制粘貼示例代碼。我無視它,因爲它表示它不會有任何效果。我應該記得winapi doc是一個嚴重寫作文檔的絕對例子。 – Malina

+0

當關閉對話框時,'OFN_NOCHANGEDIR'恢復原始工作目錄。當用戶在對話框內圍繞文件系統導航時,該對話框仍然可以更改工作目錄。 –

3

當前目錄存在,因爲它對命令行工具非常方便。它通常不太用於GUI應用程序,這可能是爲什麼微軟的開發人員不擔心允許GetOpenFileName()更改它。當然偶爾有一個邊緣案例,你可能正在處理其中的一個問題,雖然很難從你的問題中得出結論。 (你真的確認你想要的當前目錄,而不是,例如,包含你可執行文件的目錄?)

無論如何,如果你要在當前目錄下,最安全的方法是將其恢復爲程序啓動後,使用該保存的值構建完全限定的路徑。不要只是在您認爲可能發生更改時恢復原始當前目錄,請自行構建完全限定路徑。這在多線程代碼或將來可能需要多線程的代碼中(例如,幾乎所有內容)尤其重要,但它也消除了忽略當前目錄可能更改的一個或多個代碼路徑的風險。

相關問題