C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: 相対パスでのファイル参照とユーザーコントロールについて


(過去ログ 88 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■52384 / inTopicNo.1)  相対パスでのファイル参照とユーザーコントロールについて
  
□投稿者/ さちも (1回)-(2010/08/07(Sat) 12:44:07)

分類:[.NET 全般] 

[環境]
VS2005 VB.net .ntFramework2.0
WinXP

上記環境で作成しているソリューションに以下のファイルがあります
・相対パスでファイル(.xml)を参照している「クラスA」
・上記クラスAのインスタンスをメンバとする「ユーザーコントロールB」
・クラスAのインスタンスおよびユーザーコントロールBをメンバとする「フォームC」

クラスAからxmlファイルを参照する際に
"../foldername/filename.xml"のような相対パスで指定して
開発環境の「debug」フォルダの隣に「foldarname」フォルダを作成して
その直下に「filename.xml」を配置しました。
その後、クラスBおよびクラスCを作成してビルドしたのですが
「指定されたファイルがないからビルドできないよ」的なメッセージが表示されて
ビルドに失敗します。
(開発環境は職場にあり、現在自宅から書き込みしておりますので
 正確な文言を掲載する事ができず、申し訳ありません)

散々悩んだ結果、slnファイルからみて上記相対パスとなるようにxmlファイルを配置すると
(日本語がおかしくてすみません)
ビルドに成功しました。現在この状態で製造工程を進めています。

ただ…全く内容が同じファイルを2箇所に配置している状態が
いいものなのかどうかがわかりません。
(「Debug」および「Release」フォルダ内の実行ファイルからの位置とslnファイルからの位置)
実際にリリースする時は実行ファイルからの位置にファイルを配置すればよいのでしょうか?
それとも全く同じファイルを2箇所に配置する必要が発生するのでしょうか?

ユーザーコントロールBとフォームCの両方が
クラスAをメンバとしている事自体が間違いでしょうか。
フォームCでクラスAをインスタンス化して
それをユーザーコントロールBに渡すというやり方を
した方がよいでしょうか。

質問文がわかりづらくて申し訳ありません。
お知恵をお貸しいただきますよう、よろしくお願いします。
引用返信 編集キー/
■52386 / inTopicNo.2)  Re[1]: 相対パスでのファイル参照とユーザーコントロールについて
□投稿者/ なちゃ (461回)-(2010/08/07(Sat) 14:30:48)
いまひとつ状況がよく分からないのですが、ビルド時のXMLファイルの参照とは具体的にどうやっているものですか?
実行時に読み込むようなものではなく、ビルド時にパス指定で参照?しているのですか?


ちなみに実行時にファイルを読み込むような場合の話ですが、
相対パスを使う場合、単純にカレントディレクトリからの相対パスとして扱うのは危険ですよ。
まあ目的にもよりますが。

引用返信 編集キー/
■52398 / inTopicNo.3)  Re[2]: 相対パスでのファイル参照とユーザーコントロールについて
□投稿者/ kaya (3回)-(2010/08/08(Sun) 11:13:10)
一般的に外部DLLの参照を追加した場合のパスは、そのプロジェクトファイル(.vbproj)からの相対パスになります。
これは、.vbprojファイルをエディタ等で開いてみると分かります。

また、ソース中でファイルをOpenするなどの場合のパスは、アセンブリ(DLL・EXE)からの相対パスになると思います。


引用返信 編集キー/
■52405 / inTopicNo.4)  Re[1]: 相対パスでのファイル参照とユーザーコントロールについて
□投稿者/ さちも (2回)-(2010/08/08(Sun) 21:45:39)
なちゃ様、kaya様、ご返信ありがとうございます。
当方の質問文が悪く、内容が伝わりづらくて申し訳ありません。

kaya様にご指摘いただいたように

> また、ソース中でファイルをOpenするなどの場合のパスは、アセンブリ(DLL・EXE)からの相対パスになると思います。

ファイルを開く時に "..\foldername\filename.xml" のように
相対パスでの文字列を指定しました。
VisualStudioでの開発中のアセンブリ(EXE)は
「Debug」または「Release」フォルダの中にあるので
その中からの相対パスと一致するようにファイルを配置しました。


ユーザーコントロールの中から上記ファイルをOpenする処理を呼ぶと
「ファイルがありません」的なエラーメッセージが出るのです。
色々と対策を試してみたところ
slnファイルからの相対パスにファイルを配置したところ
エラーが出なくなりました。
こんな現象、他所でもでているのでしょうか…
引用返信 編集キー/
■52412 / inTopicNo.5)  Re[2]: 相対パスでのファイル参照とユーザーコントロールについて
□投稿者/ 渋木宏明 (32回)-(2010/08/09(Mon) 00:25:54)
渋木宏明 さんの Web サイト
2010/08/09(Mon) 01:55:58 編集(投稿者)

> ファイルを開く時に "..\foldername\filename.xml" のように
> 相対パスでの文字列を指定しました。

「相対パス」がどのように解決されるか、理解してますか?

相対パスは、「プロセスのカレントディレクトリ」を起点として、そこからの「相対」的なパスを示すものです。

なので、プロセスのカレントディレクトリが変化したら、「相対パス」が指すパスも変化します。だって「相対」ですから。

で、「プロセスのカレントディレクトリ」なんざ、実行の仕方で変化するし、実行時にも何らかの理由で変化する場合があります。

なので、場合にもよるけど、相対パスでのファイル参照なんかしない方がいいです。

プログラムの配置先を反映したファイルアクセスをしたいなら、この場合は、その対象のファイルと関連のあるアセンブリのパスとかから参照ファイルのパスを求めるべきです。(ほかにもいくつか方法はあります)
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -