2009-06-30 40 views
4

現在のディレクトリがプロセスのすべてのスレッドで共有されているため、SetCurrentDirectoryをマルチスレッドアプリケーションで使用しないでください。マルチスレッドアプリケーションのSetCurrentDirectory

これを念頭に置いてディレクトリを設定する最良の方法は何ですか? SetCurrentDirectoryを使ってファイルを最初にナビゲートするのではなく、ファイルを開くときにフルパス名を含めることでディレクトリを設定することを避けることができます。

答えて

7

これまでにこの問題が発生しました。

相対パスまたは検索をサポートするカレントディレクトリの概念を必要とするオブジェクト(たとえば、ビルドツール)は、現在のパスでメンテナンスするメンバプロパティを持ち、open/create /サーチ。

CurrentPathの初期値は、アプリケーションのロードフェーズで一度だけ取得できます。 main()、WinMain()、DllInit()などをGetCurrentDirectory経由で呼び出し、グローバルに格納します。その後、Win32のバージョンは無視されます。

OPENFILENAME構造には初期ディレクトリメンバーがあるため、ファイルを開く/保存ダイアログではWin32の現在のディレクトリを使用する必要はありません。

1

各プロセスにはカレントディレクトリが1つありますので、プロセス内の各スレッドに異なるカレントディレクトリを使用させたい場合は、それぞれのフルパスを指定する必要があります。

1

一般パスとローカルパスのフルパスを例外として(そして非常に慎重に)、必要に応じて使用するようアドバイスします。私。 OpenFileダイアログは現在のディレクトリを(属性に応じて)変更することができます。ファイル名やローカルパスを使用すると、問題が発生する可能性があります。

私の経験では、フルパスでファイルへのアクセスが大幅に遅くなることはありません。私は毎分何千ものファイルを開き、ソートされたデータを他の何千ものファイルに書き込むアプリケーションを書いています。ボトルネックはファイルを閉じることでした。それらを開くことはありません。

関連する問題