開発環境が以下の状態で開発を進めています。
[D]-+-[ini]-Save.ini
|
+-[SaveProgram]-(ここdsw等のファイルが入っている。)
|
SaveProgram.exe-([D]の直下にコンパイルしたEXEができる)
Save.iniファイルを使用するときは、
..\\ini\\Save.ini
というパスで問題なく動いてました。
これは、デバッガから実行したときで、EXEを直接実行すると、
「Save.iniファイルが見つからない」というエラーになって
しまいます。
※現状のフォルダ構成を変えずに、ファイルパスを正しく設定する
方法を教えてください。
開発環境は、VC++6.0,Windows2000,PlatFormSDKです。
ちなみに、上記の[D]と同じ位置に[ini]というファイルをつくり、
その中にSave.iniというファイルを入れると、
EXEからの実行時は、エラーになりません。
> SaveProgram.exe-([D]の直下にコンパイルしたEXEができる)
コレはリリース版で出来たEXEファイル、または過去に作成した(か、コピーした)EXE
ファイルではないでしょうか?
ビルド後に日付・時間を確認してみましたか?
デバッグ版は[SaveProgram]フォルダ内に作成されていると思われます。
「..」はひとつ上のディレクトリを表すわけですから、”..\\ini\\Save.ini”と指定し
たファイルにアクセスする為には「ini」と同じ階層のディレクトリ直下にいないとダメ
ですよね?
> ちなみに、上記の[D]と同じ位置に[ini]というファイルをつくり、
> その中にSave.iniというファイルを入れると、
> EXEからの実行時は、エラーになりません。
「..」はひとつ上のディレクトリを表すわけですから、合っていますよね?
[D]直下にあるEXEファイルからSave.iniにアクセスする為には”.\\ini\\Save.ini”又
は”ini\\Save.ini”となります。
ああ、”フォルダ”と書いたり”ディレクトリ”と書いたり。
”直下”と書いたり”内”と書いたり(ToT)
使い分けに意図はありません。夜中なので許して下さいませ。
#ifdef NDEBUG
// リリース版のパス指定
#else
// デバッグ版のパス指定
#endif
みたいな方法では?
iniの指定は作業ディレクトリからの相対パスになります。
(EXEの場所はあまり関係ありません)
プロジェクトの設定でビルドしたEXEの出力先・デバッグ時のEXE・
デバッグ時の作業ディレクトリを確認してください。
デバッグ時の作業ディレクトリが[SaveProgram]になっていると思います。
これを[D]にして ”ini\\Save.ini”を指定すればとりあえずOKだと思います。
> iniの指定は作業ディレクトリからの相対パスになります。
> (EXEの場所はあまり関係ありません)
デフォルトでは作業ディレクトリは空欄なので、設定していない事を前提に書いてしまいまし
た。
ただ、EXEファイルをそのまま実行する場合は作業ディレクトリは指定出来ない(何か方法があ
りますでしょうか?)ので、ショートカットを作成し、作業ディレクトリを設定してやる必要が
あります。
なので、EXEファイルがあるディレクトリから見た相対パスを指定する方がいいと思うのですが
> デフォルトでは作業ディレクトリは空欄なので、設定していない事を前提に
> 書いてしまいました。
空欄でしたっけ? すみません。なんせ”もと”なもので環境がなくて。
ディフォルトでは(指定はともかく)プロジェクトファイルの存在する
ディレクトリが作業ディレクトリになっていたとは思うのですが。
> ただ、EXEファイルをそのまま実行する場合は作業ディレクトリは指定出来ない
> (何か方法がありますでしょうか?)ので、ショートカットを作成し、
> 作業ディレクトリを設定してやる必要があります。
指定できませんよね。
EXEファイルのあるディレクトリになりますよね。確か。
> なので、EXEファイルがあるディレクトリから見た相対パスを指定する方が
> いいと思うのですが
一応 同様の意見として書いたつもりなのですが・・・
>>これを[D]にして ”ini\\Save.ini”を指定すればとりあえずOKだと思います。
作業ディレクトリをEXEファイルのあるディレクトリに設定して
相対パス(ini\\Save.ini)を指定すれば
デバッガから実行したときも、EXEを直接実行したときも動きますよ
というつもり・・・ 判りにくかったらごめんなさい。
ついでにいうと、内部でEXEファイルのフルパスを調べ(可能でしたよね?)
文字列操作して(EXEファイル名を切り取り、ini\\Save.iniを加えて)
iniファイルのフルパスを得るのが一番確実かと思います。
> ディフォルトでは(指定はともかく)プロジェクトファイルの存在する
> ディレクトリが作業ディレクトリになっていたとは思うのですが。
念の為確認しましたが、指定が無ければEXEファイルが作成されるディレクトリが作業ディレク
トリ扱いになっているようです。
> 一応 同様の意見として書いたつもりなのですが・・・
あ、すみませんです(ToT)
> ついでにいうと、内部でEXEファイルのフルパスを調べ(可能でしたよね?)
GetModuleFileNameで調べられますね。
みなさん、貴重なご意見ありがとうございます。
>ついでにいうと、内部でEXEファイルのフルパスを調べ(可能でしたよね?)
>文字列操作して(EXEファイル名を切り取り、ini\\Save.iniを加えて)
>iniファイルのフルパスを得るのが一番確実かと思います。
EXEファイルのフルパスをとることと作業フォルダのフルパスをとることが
同じ意味でないことがあるなんて知りませんでした。
CString csTmp, ExeFolder;
csTmp = __targv[nx];
int nPos = csTmp.ReverseFind('\\');
ExeFolder = csTmp.Mid(0,nPos);
として、後ろに\\ini\\Save.iniをくっつけてできました。