dポイントプレゼントキャンペーン実施中!

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

開発PCを変えたとたん、(project フォルダ丸ごと引っ越したのですが)なぜか外部ファイルが
参照出来なくなりました。そういえば最初からなんとなく出来ていただけ、、でした。

どなたか教えていただけませんか?

A 回答 (5件)

>Dos 時代、私の使っていたC++やTurboPascal(歴史を感じます。

)では、EXE ファイルの存在している場所から一つ上の階層のどのフォルダとか指定して、絶対に不都合がなかったんです。

その「EXEファイルの存在している場所」というのはどうやって求めていたのか覚えてます?それはやってなくてEXEを実行するときには必ずそのEXEがあるディレクトリがカレントディレクトリになると思い込んでいたのではないですか?
    • good
    • 0
この回答へのお礼

ありがとうございます。
#4 の方のお礼に書きましたが、一品ものの機械装置とそれ専用のソフトを書いていたので、
それで済んでしまっていました。他の作業はたとえばWindows付属のファイラーでファイルを移動
したりもあまりしない専用機です。データが出来るとフロッピーやPDなどの挿入を促して
自動に書き出すし、想定外のディレクトリにカレントが移るとも考えずにそれどころか
キーボードもマウスも接続せずにテンキーのみでほかの事は出来ない仕様にしてきました。
(機械の場合安全のためにタッチパネルでも余分な操作はできるだけ出来ないようにしてしまいます。)

それにしても、、、こんなことも分からず、今までよくトラブらなかったです。
プログラミングって恐ろしいですね。  本当に恥ずかしい限りです。

Dos のautoexec.batくせで実行フォルダがカレントになるように CD data とか強制的にセットしてから
起動して、他の用途には使わないのですから、確か Windows98くらいまではDos Ver7
とDos窓に表示されたと思います。ドライバーがなくてもポート操作が出来るDos の時代は長かった
ですね。今は外部機器のメーカーがドライバーを提供しているので、その部分は困りませんが
提供されない操作は出来ずに面白くなくなりました。

お礼日時:2013/01/12 16:38

>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/getcu …
にあるようなカレントディレクトリを表示するアプリを作って、
「コマンド プロンプトから」相対パス指定などで実行ファイルを起動してみると判るかと。
    • good
    • 0
この回答へのお礼

ありがとうございます。

ああ、なんとなく分かってきました。DOSでプログラミングといっても
自動機を動かす専用ソフトを開発していました。
ステッピングモーターなどをパラレルポートや増設のコントローラ
のポートに直接データを書き出していたのです。

つまり不特定多数の方々に使ってもらおう!というアプリケーションを
作ったことはなく、そのマシン専用、直結なので開発環境(PC98や初期のDOSV)
をマシンに接続した現場でプログラミングして動かしていたのでした。
Windows時代になっても用途がそんな専用の用途ですから状況は同じです。

専用ですからパスやカレントディレクトリはautoexec.batに書いてあっていつでも
その環境が自動に立ち上がっていたのでなんの問題もなかったわけです。

一度動けばディレクトリ構造も同じならずっと動くわけです(現実にたくさんの
専用機自動ミシンやら三次元測定器などが問題もなく動いていました。)

それで、「動いていたからプログラミングできるんだ」と思ってしまい
今回のような超基本が分からないまま来てしまったのですね。 お恥ずかしい。
サンプルソフト、参考にさせていただきます。

お礼日時:2013/01/12 16:18

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



参考URL:http://www.atmarkit.co.jp/fdotnet/dotnettips/016 …
    • good
    • 0
この回答へのお礼

ありがとうございます。

  string path = Application.ExecutablePath;

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

お礼日時:2013/01/11 17:33

#1の方もいわれていますが実行開始時の基準となるディレクトリはカレントディレクトリです。

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

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

お礼日時:2013/01/11 13:23

>アプリケーションから外部のファイルを参照


>するのにいったいどこから相対パスを記述( ../../data/test.png)すればよいのか分からず

「カレントディレクトリからの相対パス」はあてに出来ないかと思われますが…。
プログラム実行中でもそのプロセスのカレントディレクトリは変化する場合がありますし、
ショートカットを作成して作業ディレクトリを実行ファイルと別の場所に指定することも可能です。

実行ファイルのパス名を取得してそこから文字列編集を行って絶対パス名にしてからファイルアクセスするべきではないでしょうか?
# 実行ファイルのパス名(実行ファイルのフルパス名)の取得は
# http://www.atmarkit.co.jp/fdotnet/dotnettips/016 … など。

その上で……VisualStudio C# 2010上での実行の際の実行ディレクトリを指定したい。
というのであれば……プロジェクトのプロパティを開き、「デバッグ」のシート(?)に「実行ディレクトリ」という項目がありますのでそちらで設定できます。
    • good
    • 0
この回答へのお礼

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

お礼日時:2013/01/11 13:13

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!