フォルダ位置(デバッガ実行とEXE実行時との違い) – プログラミング – Home

フォルダ位置(デバッガ実行とEXE実行...
 
通知
すべてクリア

[解決済] フォルダ位置(デバッガ実行とEXE実行時との違い)


roccy
 roccy
(@roccy)
ゲスト
結合: 23年前
投稿: 82
Topic starter  

開発環境が以下の状態で開発を進めています。

[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からの実行時は、エラーになりません。


引用未解決
トピックタグ
ひろぴー
 ひろぴー
(@ひろぴー)
ゲスト
結合: 22年前
投稿: 182
 

> 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”となります。


返信引用
ひろぴー
 ひろぴー
(@ひろぴー)
ゲスト
結合: 22年前
投稿: 182
 

ああ、”フォルダ”と書いたり”ディレクトリ”と書いたり。
”直下”と書いたり”内”と書いたり(ToT)
使い分けに意図はありません。夜中なので許して下さいませ。


返信引用
たみあ
 たみあ
(@たみあ)
ゲスト
結合: 22年前
投稿: 57
 

#ifdef NDEBUG
// リリース版のパス指定
#else
// デバッグ版のパス指定
#endif

みたいな方法では?


返信引用
もとPG
 もとPG
(@もとPG)
ゲスト
結合: 22年前
投稿: 2
 

iniの指定は作業ディレクトリからの相対パスになります。
(EXEの場所はあまり関係ありません)

プロジェクトの設定でビルドしたEXEの出力先・デバッグ時のEXE・
デバッグ時の作業ディレクトリを確認してください。

デバッグ時の作業ディレクトリが[SaveProgram]になっていると思います。
これを[D]にして ”ini\\Save.ini”を指定すればとりあえずOKだと思います。


返信引用
ひろぴー
 ひろぴー
(@ひろぴー)
ゲスト
結合: 22年前
投稿: 182
 

> iniの指定は作業ディレクトリからの相対パスになります。
> (EXEの場所はあまり関係ありません)

デフォルトでは作業ディレクトリは空欄なので、設定していない事を前提に書いてしまいまし
た。

ただ、EXEファイルをそのまま実行する場合は作業ディレクトリは指定出来ない(何か方法があ
りますでしょうか?)ので、ショートカットを作成し、作業ディレクトリを設定してやる必要が
あります。

なので、EXEファイルがあるディレクトリから見た相対パスを指定する方がいいと思うのですが


返信引用
もとPG
 もとPG
(@もとPG)
ゲスト
結合: 22年前
投稿: 2
 

> デフォルトでは作業ディレクトリは空欄なので、設定していない事を前提に
> 書いてしまいました。
空欄でしたっけ? すみません。なんせ”もと”なもので環境がなくて。
ディフォルトでは(指定はともかく)プロジェクトファイルの存在する
ディレクトリが作業ディレクトリになっていたとは思うのですが。

> ただ、EXEファイルをそのまま実行する場合は作業ディレクトリは指定出来ない
> (何か方法がありますでしょうか?)ので、ショートカットを作成し、
> 作業ディレクトリを設定してやる必要があります。
指定できませんよね。
EXEファイルのあるディレクトリになりますよね。確か。

> なので、EXEファイルがあるディレクトリから見た相対パスを指定する方が
> いいと思うのですが
一応 同様の意見として書いたつもりなのですが・・・
>>これを[D]にして ”ini\\Save.ini”を指定すればとりあえずOKだと思います。
作業ディレクトリをEXEファイルのあるディレクトリに設定して
相対パス(ini\\Save.ini)を指定すれば
デバッガから実行したときも、EXEを直接実行したときも動きますよ
というつもり・・・ 判りにくかったらごめんなさい。

ついでにいうと、内部でEXEファイルのフルパスを調べ(可能でしたよね?)
文字列操作して(EXEファイル名を切り取り、ini\\Save.iniを加えて)
iniファイルのフルパスを得るのが一番確実かと思います。


返信引用
ひろぴー
 ひろぴー
(@ひろぴー)
ゲスト
結合: 22年前
投稿: 182
 

> ディフォルトでは(指定はともかく)プロジェクトファイルの存在する
> ディレクトリが作業ディレクトリになっていたとは思うのですが。
念の為確認しましたが、指定が無ければEXEファイルが作成されるディレクトリが作業ディレク
トリ扱いになっているようです。

> 一応 同様の意見として書いたつもりなのですが・・・
あ、すみませんです(ToT)

> ついでにいうと、内部でEXEファイルのフルパスを調べ(可能でしたよね?)
GetModuleFileNameで調べられますね。


返信引用
roccy
 roccy
(@roccy)
ゲスト
結合: 23年前
投稿: 82
Topic starter  

みなさん、貴重なご意見ありがとうございます。

>ついでにいうと、内部で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をくっつけてできました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました