2009-06-30 94 views
4

我知道SetCurrentDirectory不應該用於多線程應用程序,因爲當前目錄在進程中的所有線程之間共享。多線程應用程序中的SetCurrentDirectory

考慮到這一點,設置目錄的最佳方法是什麼? 通過在打開文件時包含完整路徑名而不是使用SetCurrentDirectory首先導航到目錄,可以避免設置目錄,但這是唯一的解決方案嗎?

回答

7

我以前遇到過這個問題。

任何需要當前目錄的概念來支持相對路徑或搜索的對象(例如構建工具)都有一個用「當前」路徑維護的成員屬性,然後構建完整路徑以打開/創建/搜索。

CurrentPath的初始值可以在應用程序的加載階段(例如, main(),WinMain(),DllInit()等通過GetCurrentDirectory存儲在全局。之後,Win32版本被忽略。

OPENFILENAME結構具有初始目錄成員,因此文件打開/保存對話框不必使用Win32當前目錄。

1

每個進程都有一個當前目錄,所以如果你希望進程中的每個線程使用不同的當前目錄,我認爲你應該在每個目錄中指定完整的路徑。

1

建議在一般情況下使用完整路徑,本地路徑僅在需要時作爲例外(並非常謹慎)。即OpenFile對話框可能會改變或不改變當前目錄(取決於屬性)等。使用文件名或本地路徑是導致問題的一個潛在原因。

根據我的經驗,完整路徑不會顯着減慢文件訪問速度。我編寫了一個應用程序,可以每分鐘打開數千個文件,並將有序數據寫入其他數千個文件 - 全部使用完整路徑,全部使用Windows安裝的網絡驅動器。那裏的瓶頸正在關閉文件。不打開它們。