![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
VisualStudio2010 C# で作業をしています。
非常に基本的なことが分からず困っています。 アプリケーションから外部のファイルを参照
するのにいったいどこから相対パスを記述( ../../data/test.png)すればよいのか分からず
あちこちにフォルダを移動してみますがなかなかうまくいきません。実行ファイルが生成される
フォルダが起点だとするとどうも違うようなのです。objフォルダでもbinフォルダのどこでもなく
だとするといったいどこが実行の基準なのか、?Dos の時代からプログラミングしているのに
(すごくシンプルだからこんな悩みはなかったのに)なんでこんなコトがわからないのか、、
情けないです。
開発PCを変えたとたん、(project フォルダ丸ごと引っ越したのですが)なぜか外部ファイルが
参照出来なくなりました。そういえば最初からなんとなく出来ていただけ、、でした。
どなたか教えていただけませんか?
A 回答 (5件)
- 最新から表示
- 回答順に表示
No.5
- 回答日時:
>Dos 時代、私の使っていたC++やTurboPascal(歴史を感じます。
)では、EXE ファイルの存在している場所から一つ上の階層のどのフォルダとか指定して、絶対に不都合がなかったんです。その「EXEファイルの存在している場所」というのはどうやって求めていたのか覚えてます?それはやってなくてEXEを実行するときには必ずそのEXEがあるディレクトリがカレントディレクトリになると思い込んでいたのではないですか?
ありがとうございます。
#4 の方のお礼に書きましたが、一品ものの機械装置とそれ専用のソフトを書いていたので、
それで済んでしまっていました。他の作業はたとえばWindows付属のファイラーでファイルを移動
したりもあまりしない専用機です。データが出来るとフロッピーやPDなどの挿入を促して
自動に書き出すし、想定外のディレクトリにカレントが移るとも考えずにそれどころか
キーボードもマウスも接続せずにテンキーのみでほかの事は出来ない仕様にしてきました。
(機械の場合安全のためにタッチパネルでも余分な操作はできるだけ出来ないようにしてしまいます。)
それにしても、、、こんなことも分からず、今までよくトラブらなかったです。
プログラミングって恐ろしいですね。 本当に恥ずかしい限りです。
Dos のautoexec.batくせで実行フォルダがカレントになるように CD data とか強制的にセットしてから
起動して、他の用途には使わないのですから、確か Windows98くらいまではDos Ver7
とDos窓に表示されたと思います。ドライバーがなくてもポート操作が出来るDos の時代は長かった
ですね。今は外部機器のメーカーがドライバーを提供しているので、その部分は困りませんが
提供されない操作は出来ずに面白くなくなりました。
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/getcu …
にあるようなカレントディレクトリを表示するアプリを作って、
「コマンド プロンプトから」相対パス指定などで実行ファイルを起動してみると判るかと。
ありがとうございます。
ああ、なんとなく分かってきました。DOSでプログラミングといっても
自動機を動かす専用ソフトを開発していました。
ステッピングモーターなどをパラレルポートや増設のコントローラ
のポートに直接データを書き出していたのです。
つまり不特定多数の方々に使ってもらおう!というアプリケーションを
作ったことはなく、そのマシン専用、直結なので開発環境(PC98や初期のDOSV)
をマシンに接続した現場でプログラミングして動かしていたのでした。
Windows時代になっても用途がそんな専用の用途ですから状況は同じです。
専用ですからパスやカレントディレクトリはautoexec.batに書いてあっていつでも
その環境が自動に立ち上がっていたのでなんの問題もなかったわけです。
一度動けばディレクトリ構造も同じならずっと動くわけです(現実にたくさんの
専用機自動ミシンやら三次元測定器などが問題もなく動いていました。)
それで、「動いていたからプログラミングできるんだ」と思ってしまい
今回のような超基本が分からないまま来てしまったのですね。 お恥ずかしい。
サンプルソフト、参考にさせていただきます。
No.3
- 回答日時:
ありがとうございます。
string path = Application.ExecutablePath;
こんなことをして、自分自身の実行パスを得るとは、エクスプローラでフォルダの構造は見えるのに
なんとももどかしいですね。それだけプログラミングがシンプルじゃなくなっているということ
なんですね。やはり今の環境でやりやすい方法を採るのが賢い方法だと思いました。
No.2
- 回答日時:
#1の方もいわれていますが実行開始時の基準となるディレクトリはカレントディレクトリです。
ただしカレントディレクトリはユーザーが好きに変えれますしプログラム内でも変えられますから外部ファイルを参照する基準にはできません。これはMS-DOSの頃でも同じです(MS-DOS時代にされてたプログラミングでは「必ず実行ファイルのあるディレクトリで実行してください」みたいな感じでされてたんじゃないですか?)。ありがとうございます。 #1の方のお礼に書きましたが実行ファイルの位置からの
相対パスにしておくと、バックアップとリストアなどの時にフォルダ構造ごとそっくり
コピーすれば環境によらず便利だったのです。実はキネクトセンサーでOpenNI のサンプル
をみたら、設定ファイルの位置が ../../Data/config.xml のようになっていました。
そこで、以前のようにEXE (debug,releaseなどなど)あれこれたくさんできる実行ファイル
と同じフォルダの中に参照ファイルを置いてもダメ、EXEファイルを配布用に
取り出して同じフォルダに入れれば参照できる。これはなんなのだ、EXEファイルの位置と
違うどこか見えないフォルダが実行時の基準フォルダなのか????ということになって
しまいました。
No.1
- 回答日時:
>アプリケーションから外部のファイルを参照
>するのにいったいどこから相対パスを記述( ../../data/test.png)すればよいのか分からず
「カレントディレクトリからの相対パス」はあてに出来ないかと思われますが…。
プログラム実行中でもそのプロセスのカレントディレクトリは変化する場合がありますし、
ショートカットを作成して作業ディレクトリを実行ファイルと別の場所に指定することも可能です。
実行ファイルのパス名を取得してそこから文字列編集を行って絶対パス名にしてからファイルアクセスするべきではないでしょうか?
# 実行ファイルのパス名(実行ファイルのフルパス名)の取得は
# http://www.atmarkit.co.jp/fdotnet/dotnettips/016 … など。
その上で……VisualStudio C# 2010上での実行の際の実行ディレクトリを指定したい。
というのであれば……プロジェクトのプロパティを開き、「デバッグ」のシート(?)に「実行ディレクトリ」という項目がありますのでそちらで設定できます。
ありがとうございます。VisualStudio2010 の実行ディレクトリは
そんなふうに考えてゆくのですね。質問のしかたがあまり適切で
なかったようです。Dos 時代、私の使っていたC++やTurboPascal(歴史を感じます。)
では、EXE ファイルの存在している場所から一つ上の階層のどのフォルダとか
指定して、絶対に不都合がなかったんです。それが、Debug とRerease の他にも
X86と64ビットなどEXEファイルが設定であちこちにできて、どうやらそれぞれの
EXEファイルの場所からいくつ上の階層のディレクトリの中のファイルを参照
するのだとフォルダとファイルを置いてみてもちっとも勝手が違うのでとまどい
ました。いつでも絶対パスで済むように工夫します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・「I love you」 をかっこよく翻訳してみてください
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・昔のあなたへのアドバイス
- ・かっこよく答えてください!!
- ・あなたが好きな本屋さんを教えてください
- ・スタッフと宿泊客が全員斜め上を行くホテルのレビュー
- ・【大喜利】【投稿~8/27】 こんなガソリンスタンド二度と来るか!なぜそう思った?
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・【お題】動物のキャッチフレーズ
- ・【お題】甲子園での思い出の残し方
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・「それ、メッセージ花火でわざわざ伝えること?」
- ・自分用のお土産
- ・人生で一番お金がなかったとき
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・ちょっと先の未来クイズ第1問
- ・ゴリラ向け動画サイト「ウホウホ動画」にありがちなこと
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
コマンドプロンプトのエラーに...
-
exeファイルを実行するとコマン...
-
[teraterm] waitコマンドで停止...
-
VBscriptが起動しない?
-
「読み取りと実行」と「読み取...
-
ネットワーク名が見つかりません
-
これってパソコンの最適化が完...
-
バッチファイルの内容を表示さ...
-
バッチファイルが不正終了して...
-
PDFファイルを開き、印刷し、閉...
-
VScodeのエラー解決法 Pythonの...
-
VBAでバッチファイルを1つ実行...
-
NASに移したBATファイルからセ...
-
Access の VBA 実行中に他の操...
-
メッセージを他のPCに出したい
-
VBScriptでコマンドプロンプト...
-
エクセル フォルダの画像を画...
-
16進数の変換処理
-
WSH.Run の処理内容をテキスト...
-
windows10 デフォルトで開発出...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
コマンドプロンプトのエラーに...
-
exeファイルを実行するとコマン...
-
VBscriptが起動しない?
-
「読み取りと実行」と「読み取...
-
[teraterm] waitコマンドで停止...
-
バッチファイルで以下のような...
-
バッチファイルの内容を表示さ...
-
PDFファイルを開き、印刷し、閉...
-
エクセル フォルダの画像を画...
-
これってパソコンの最適化が完...
-
バッチファイルが不正終了して...
-
ネットワーク名が見つかりません
-
シェルで5分前の時間を取得したい
-
pythonスクリプトを管理者権限...
-
Excel(エクセル) VBA プロシー...
-
複数のbatファイルを自動実行し...
-
Excel VBA ステップインが途中...
-
メッセージを他のPCに出したい
-
16進数の変換処理
-
VB.NETでのDOSコマンドを実行に...
おすすめ情報