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を探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
コマンドプロンプトのエラーに...
-
これってパソコンの最適化が完...
-
VBscriptが起動しない?
-
【VB.NET】exeを実行すると「発...
-
「読み取りと実行」と「読み取...
-
バッチファイルの内容を表示さ...
-
VScodeのエラー解決法 Pythonの...
-
16進数の変換処理
-
Accessからバッチ処理を実施し...
-
シェルからCで作った実行ファイ...
-
VBScript(WHS)でWMIを使ってリ...
-
SHELLコマンドがうまく動かない...
-
Excel(エクセル) VBA プロシー...
-
PDFファイルを開き、印刷し、閉...
-
MATLABでssを実行すると、未定...
-
Linux Makefile変数の値をプロ...
-
VBS実行時にコマンドプロンプト...
-
バッチファイルでnslookup
-
BATファイルについて
-
exeファイルを実行するとコマン...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
コマンドプロンプトのエラーに...
-
exeファイルを実行するとコマン...
-
[teraterm] waitコマンドで停止...
-
「読み取りと実行」と「読み取...
-
これってパソコンの最適化が完...
-
VBscriptが起動しない?
-
ネットワーク名が見つかりません
-
hostファイル
-
バッチファイルの内容を表示さ...
-
エクセル フォルダの画像を画...
-
PDFファイルを開き、印刷し、閉...
-
バッチファイルで以下のような...
-
Excel(エクセル) VBA プロシー...
-
VScodeのエラー解決法 Pythonの...
-
NASに移したBATファイルからセ...
-
pythonスクリプトを管理者権限...
-
Excel VBA ステップインが途中...
-
バッチファイルが不正終了して...
-
16進数の変換処理
-
複数のbatファイルを自動実行し...
おすすめ情報