
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で質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 【マクロ】フォルダAからダBへファイルを、ファイルの更新日時の条件で、1つづつ移動するには? 3 2022/08/25 09:56
- Excel(エクセル) フォルダAから1つのファイルだけを、フォルダBへを移動するVBAについて 2 2022/07/25 11:45
- Excel(エクセル) 【VBAファイル移動】2つのマクロを順に実行。1つ目のマクロが実行不可⇒2つ目が実行不可となる件 2 2022/07/29 12:17
- Visual Basic(VBA) 【マクロ】フォルダにファイルが1つも無い時に、ファイルがありませんとメッセージを表示する 4 2022/08/28 08:48
- Excel(エクセル) 【マクロ】エラーが発生⇒実行時エラー58既に同名のファイルが存在 5 2022/08/31 10:03
- Excel(エクセル) 【マクロ】ファイルを古い順に、1個ずつ移動する 1 2022/09/06 20:30
- Android VBA、フォルダのパスに環境文字 ㉑ があり、VBAが機能しません。 2 2022/07/27 09:16
- Excel(エクセル) ファイル一覧表を使ったファイルの移動 5 2022/08/10 15:37
- Windows 10 ショートカットの作り方と使い方について教えて下さい。 3 2022/05/27 08:44
- Excel(エクセル) 【マクロ】ファイル名の日付によって、保管するフォルダを、自動選択したい 4 2023/08/16 11:24
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
コマンドプロンプトのエラーに...
-
Windows System32 Security Hea...
-
これってパソコンの最適化が完...
-
複数のbatファイルを自動実行し...
-
exeファイルを実行するとコマン...
-
[es]でpython2.5のファイル実行
-
ネットワーク名が見つかりません
-
[teraterm] waitコマンドで停止...
-
pythonスクリプトを管理者権限...
-
VBScript(WHS)でWMIを使ってリ...
-
PDFファイルを開き、印刷し、閉...
-
VBA 既に開いているBookに継続...
-
gccのプロファイラで時間が取得...
-
「読み取りと実行」と「読み取...
-
Excel2010 VBAが特定動作で実行...
-
CGI Error
-
バッチファイルの内容を表示さ...
-
バッチにてforでiniファイルの...
-
VBAを使って名前をつけて保存を...
-
三菱ラダーについて教えて下さい。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
コマンドプロンプトのエラーに...
-
[teraterm] waitコマンドで停止...
-
バッチファイルの内容を表示さ...
-
exeファイルを実行するとコマン...
-
VBscriptが起動しない?
-
これってパソコンの最適化が完...
-
「読み取りと実行」と「読み取...
-
複数のbatファイルを自動実行し...
-
Windows System32 Security Hea...
-
ネットワーク名が見つかりません
-
エクセル フォルダの画像を画...
-
Excel(エクセル) VBA プロシー...
-
PDFファイルを開き、印刷し、閉...
-
Access の VBA 実行中に他の操...
-
バッチファイルが不正終了して...
-
VScodeのエラー解決法 Pythonの...
-
VBScriptでコマンドプロンプト...
-
pythonスクリプトを管理者権限...
-
VB.NETでのDOSコマンドを実行に...
-
batからexeを実行し戻り値を受...
おすすめ情報