• 締切済み

VS2010の実行ディレクトリはどこですか?

VisualStudio2010 C# で作業をしています。 非常に基本的なことが分からず困っています。 アプリケーションから外部のファイルを参照 するのにいったいどこから相対パスを記述( ../../data/test.png)すればよいのか分からず あちこちにフォルダを移動してみますがなかなかうまくいきません。実行ファイルが生成される フォルダが起点だとするとどうも違うようなのです。objフォルダでもbinフォルダのどこでもなく だとするといったいどこが実行の基準なのか、?Dos の時代からプログラミングしているのに (すごくシンプルだからこんな悩みはなかったのに)なんでこんなコトがわからないのか、、 情けないです。 開発PCを変えたとたん、(project フォルダ丸ごと引っ越したのですが)なぜか外部ファイルが 参照出来なくなりました。そういえば最初からなんとなく出来ていただけ、、でした。 どなたか教えていただけませんか?

みんなの回答

  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.5

>Dos 時代、私の使っていたC++やTurboPascal(歴史を感じます。)では、EXE ファイルの存在している場所から一つ上の階層のどのフォルダとか指定して、絶対に不都合がなかったんです。 その「EXEファイルの存在している場所」というのはどうやって求めていたのか覚えてます?それはやってなくてEXEを実行するときには必ずそのEXEがあるディレクトリがカレントディレクトリになると思い込んでいたのではないですか?

goropapa
質問者

お礼

ありがとうございます。 #4 の方のお礼に書きましたが、一品ものの機械装置とそれ専用のソフトを書いていたので、 それで済んでしまっていました。他の作業はたとえばWindows付属のファイラーでファイルを移動 したりもあまりしない専用機です。データが出来るとフロッピーやPDなどの挿入を促して 自動に書き出すし、想定外のディレクトリにカレントが移るとも考えずにそれどころか キーボードもマウスも接続せずにテンキーのみでほかの事は出来ない仕様にしてきました。 (機械の場合安全のためにタッチパネルでも余分な操作はできるだけ出来ないようにしてしまいます。) それにしても、、、こんなことも分からず、今までよくトラブらなかったです。 プログラミングって恐ろしいですね。  本当に恥ずかしい限りです。 Dos のautoexec.batくせで実行フォルダがカレントになるように CD data とか強制的にセットしてから 起動して、他の用途には使わないのですから、確か Windows98くらいまではDos Ver7 とDos窓に表示されたと思います。ドライバーがなくてもポート操作が出来るDos の時代は長かった ですね。今は外部機器のメーカーがドライバーを提供しているので、その部分は困りませんが 提供されない操作は出来ずに面白くなくなりました。

  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.4

>Dos 時代、私の使っていたC++やTurboPascal(歴史を感じます。) >では、EXE ファイルの存在している場所から一つ上の階層のどのフォルダとか >指定して、絶対に不都合がなかったんです。 本当にカレントディレクトリからの相対パスで書いていたとすると… 問題が出ない。ということはなかったはずですが。 パスが切ってあれば、実行ファイルをコマンドラインで指定して実行開始したときのディレクトリがカレントディレクトリになりますし、 C:\MYAPP\APP1\APP1.EXEを実行する場合に C:\>MYAPP\APP1\APP1.EXE で実行するとカレントディレクトリはC:\、 C:\MYAPP\APP2>..\APP1\APP1.EXE で実行するとC:\MYAPP\APP2がカレントディレクトリとなっていたはずです。 ファイラー(FDとかが有名でしたかね)とか使っていた場合は「カレントディレクトリを実行ファイルのある場所に変更してから実行する」とかのオプショがあったのかも知れませんが。 http://jeanne.wankuma.com/tips/csharp/path/getcurrentdirectory.html にあるようなカレントディレクトリを表示するアプリを作って、 「コマンド プロンプトから」相対パス指定などで実行ファイルを起動してみると判るかと。

goropapa
質問者

お礼

ありがとうございます。 ああ、なんとなく分かってきました。DOSでプログラミングといっても 自動機を動かす専用ソフトを開発していました。 ステッピングモーターなどをパラレルポートや増設のコントローラ のポートに直接データを書き出していたのです。 つまり不特定多数の方々に使ってもらおう!というアプリケーションを 作ったことはなく、そのマシン専用、直結なので開発環境(PC98や初期のDOSV) をマシンに接続した現場でプログラミングして動かしていたのでした。 Windows時代になっても用途がそんな専用の用途ですから状況は同じです。 専用ですからパスやカレントディレクトリはautoexec.batに書いてあっていつでも その環境が自動に立ち上がっていたのでなんの問題もなかったわけです。 一度動けばディレクトリ構造も同じならずっと動くわけです(現実にたくさんの 専用機自動ミシンやら三次元測定器などが問題もなく動いていました。) それで、「動いていたからプログラミングできるんだ」と思ってしまい 今回のような超基本が分からないまま来てしまったのですね。 お恥ずかしい。 サンプルソフト、参考にさせていただきます。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

とりあえず「実行ファイルのあるフォルダ」は分かるみたい.

参考URL:
http://www.atmarkit.co.jp/fdotnet/dotnettips/016exepath/exepath.html
goropapa
質問者

お礼

ありがとうございます。   string path = Application.ExecutablePath; こんなことをして、自分自身の実行パスを得るとは、エクスプローラでフォルダの構造は見えるのに なんとももどかしいですね。それだけプログラミングがシンプルじゃなくなっているということ なんですね。やはり今の環境でやりやすい方法を採るのが賢い方法だと思いました。

  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.2

#1の方もいわれていますが実行開始時の基準となるディレクトリはカレントディレクトリです。ただしカレントディレクトリはユーザーが好きに変えれますしプログラム内でも変えられますから外部ファイルを参照する基準にはできません。これはMS-DOSの頃でも同じです(MS-DOS時代にされてたプログラミングでは「必ず実行ファイルのあるディレクトリで実行してください」みたいな感じでされてたんじゃないですか?)。

goropapa
質問者

お礼

ありがとうございます。 #1の方のお礼に書きましたが実行ファイルの位置からの 相対パスにしておくと、バックアップとリストアなどの時にフォルダ構造ごとそっくり コピーすれば環境によらず便利だったのです。実はキネクトセンサーでOpenNI のサンプル をみたら、設定ファイルの位置が ../../Data/config.xml のようになっていました。 そこで、以前のようにEXE (debug,releaseなどなど)あれこれたくさんできる実行ファイル と同じフォルダの中に参照ファイルを置いてもダメ、EXEファイルを配布用に 取り出して同じフォルダに入れれば参照できる。これはなんなのだ、EXEファイルの位置と 違うどこか見えないフォルダが実行時の基準フォルダなのか????ということになって しまいました。

  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.1

>アプリケーションから外部のファイルを参照 >するのにいったいどこから相対パスを記述( ../../data/test.png)すればよいのか分からず 「カレントディレクトリからの相対パス」はあてに出来ないかと思われますが…。 プログラム実行中でもそのプロセスのカレントディレクトリは変化する場合がありますし、 ショートカットを作成して作業ディレクトリを実行ファイルと別の場所に指定することも可能です。 実行ファイルのパス名を取得してそこから文字列編集を行って絶対パス名にしてからファイルアクセスするべきではないでしょうか? # 実行ファイルのパス名(実行ファイルのフルパス名)の取得は # http://www.atmarkit.co.jp/fdotnet/dotnettips/016exepath/exepath.html など。 その上で……VisualStudio C# 2010上での実行の際の実行ディレクトリを指定したい。 というのであれば……プロジェクトのプロパティを開き、「デバッグ」のシート(?)に「実行ディレクトリ」という項目がありますのでそちらで設定できます。

goropapa
質問者

お礼

ありがとうございます。VisualStudio2010 の実行ディレクトリは そんなふうに考えてゆくのですね。質問のしかたがあまり適切で なかったようです。Dos 時代、私の使っていたC++やTurboPascal(歴史を感じます。) では、EXE ファイルの存在している場所から一つ上の階層のどのフォルダとか 指定して、絶対に不都合がなかったんです。それが、Debug とRerease の他にも X86と64ビットなどEXEファイルが設定であちこちにできて、どうやらそれぞれの EXEファイルの場所からいくつ上の階層のディレクトリの中のファイルを参照 するのだとフォルダとファイルを置いてみてもちっとも勝手が違うのでとまどい ました。いつでも絶対パスで済むように工夫します。

関連するQ&A