普通はGetCurrentDirectory()関数を使用すると取れるのですが
FileDialogでカレントと異なる任意ファイルを選んだ後使用すると
正しいパスが取れないのですが
いつでも正しいパスが取れる方法ってありますか?
VS2008 MFC
#include afxdlgs.h
void CTestDlg::OnBnClickedButton1()
{
CFile f;
if(f.Open(_T(Test.txt), CFile::modeRead))
{
TRACE(true\n);
}
else
{
TRACE(false\n);//ファイルダイアログ実行後だと失敗
}
}
void CTestDlg::OnBnClickedButton2()
{
CFileDialog dlg(true);
dlg.DoModal();
}
GetCurrentDirectory()が戻すパスは、SetCurrentDirectory()で
任意に変更できます(されます)。
どのような意味の「正しいパス」を希望していますか(質問)。
例) 1.実行ファイルの物理パス
2.システムのパス
3.その他
カレントディレクトリは、
「現在(直近)の作業パス」のこと
既定の動作ではファイルダイアログが
勝手にカレントディレクトリーを変更してしまうので、
CFileDialogのコンストラクターから
OFN_NOCHANGEDIRフラグを追加してやるのが簡単です。
回答ありがとうございます。関連のSet…は見ましたがこれが勝手に呼ばれいていて
EXEが実行されているパスかと思っていましたものが変わってしまうようですね。
OFN_NOCHANGEDIRを入れることにします。
解決になっていますが、
実行ファイル(xxx.exe)があるファイルがカレントディレクトリと言うわけではないので
注意して下さい。
カレントディレクトリは実行時にクリックしたショートカットの設定等によっても
変わりますから、自分が欲しいディレクトリがカレントディレクトリで本当に正しいのか
を良く考えて設計される事をお勧めします。
基本的にカレントディレクトリは当てにならない事が多いので使わない事が多いです。
間違いがあったので。
誤)
実行ファイル(xxx.exe)があるファイルがカレントディレクトリと言うわけではないので
正)
実行ファイル(xxx.exe)があるフォルダがカレントディレクトリと言うわけではないので
文脈からわかるかと思いますが、念のため。
PATIOさんも書かれていますが…
私もカレントディレクトリはあてにならないので、GetModuleFileName()で実行ファイル
のファイル名を取得して、パス名分解していますね。
実行ファイルのある場所からの相対パスでアクセスする場合もGetModuleFileName()で実
行ファイル名を取得してから絶対パス名にしてアクセスしています。
# ネットワーク共有の場合を考慮する必要がある…かも知れませんが。
本題とは関係ありませんが…Cookieの問題なのか「お名前」が化けることがありますねぇ……。
カレントはあくまで可変の作業用ディレクトリのデフォルト値として覚えておくことにし
ます。
GetModuleFileName便利そうですね、アプリケーションで相対パス見るときも
モジュール位置からの相対にしてくれればいいのに。
名前は化けないであろうものに変える事にします。。。