2016-12-20 4 views
0

GetOpenFileNameの呼び出し後、プロセスの現在のディレクトリは、開かれたファイルのファイルのディレクトリに変更されます(GetOpenFileName)。現在のディレクトリが変更される理由


代わりにデフォルトのカレントディレクトリを保持する方法はありますか?

+2

はまた、このテーマに関するレイモンド陳氏のブログ記事を参照してください。それがあなたの質問に答える一方で、あなたが**本当に**何をしているべきかは、現在の作業ディレクトリに全く依存していないということです。あなたはたった一つの理由を経験しただけです。 – IInspectable

+0

同じディレクトリの別のプログラムはローカルファイルのみを開くことができるので、両方のプログラムが互いに通信するため、ローカルディレクトリのファイルを高速に作成する必要があります。途中でありがとう。 – Malina

+1

それでは、必要なファイルをすべて作成してください。なぜ、これは現在の作業ディレクトリに頼る必要があるのですか? – IInspectable

答えて

2

代わりにデフォルトのカレントディレクトリを維持するにはどうすればよいですか?

あなたがOPENFILENAME documentationを読めば、その正確な目的のためにOFN_NOCHANGEDIRフラグがあります:ファイルを検索しながら、ユーザーがディレクトリを変更した場合

は元の値にカレントディレクトリを復元します。

ドキュメントの内容にもかかわらず、このフラグはGetOpenFileName()でサポートされています。呼び出しが復帰したら、それを保存し、それを復元することによって

Why does the common file dialog change the current directory?

+1

Huh。ドキュメントによると、フラグは現在のディレクトリを元の値に戻すが、Raymondの記事によれば、現在のディレクトリは変更されないという。実際に何が実際に起こるかを知っていますか? (もちろん、シングルスレッドのプログラムでは関係ありません。) –

+0

私は記事を読みました。私はサンプルコードを貼り付けません。それは何の効果もないと言われたので、私はそれを無視しました。私はwinapi docがひどく書かれたdocの完全な例であることを覚えておくべきです。 – Malina

+0

'OFN_NOCHANGEDIR'は、ダイアログが閉じられたときに元の作業ディレクトリを復元します。ユーザがダイアログ内からファイルシステムの周りをナビゲートしている間も、ダイアログは作業ディレクトリを変更することができます。 –

3

コマンドラインツールでは非常に便利なので、現在のディレクトリが存在します。一般に、GUIアプリケーションではそれほど多くは使用されません。これはおそらくMicrosoftの開発者がGetOpenFileName()がそれを変更することを心配していなかった理由です。当然のことながら、時折端を結ぶケースがあります。あなたの質問から書いた通りに伝えるのは難しいですが、そのうちの1つを扱っているかもしれません。 (あなたはあなたの実行可能ファイルを含むディレクトリ、たとえば、あなたは現在のディレクトリを望んでいないことが確実か?)

いずれにせよ、あなたはは、現在のディレクトリをしたいですか場合、最も安全なアプローチとして、それを取得することですプログラムが開始されるとすぐに、保存された値を使用して完全修飾パスを作成します。元のカレントディレクトリを変更したと思われるときはいつも、元のカレントディレクトリを復元するだけでなく、完全修飾パスを自分で作成してください。これは、マルチスレッドコードや将来的にはマルチスレッド化が必要なコードでは特に重要ですが、現在のディレクトリが変更される可能性があるコードパスを1つ以上見落とす危険もなくなります。

関連する問題