質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

Q&A

解決済

4回答

1848閲覧

WindowsFormsで表示する画像のフルパスを取得する

dev3310

総合スコア24

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

0グッド

0クリップ

投稿2019/06/03 00:23

WindowsFormsを使用してアプリ開発をしています。

あるソフトと連携する為に、アプリ内で使用する画像をフルパス指定しなければなりません。

プロジェクトフォルダ
├bin
├img
├obj
├Properties
├App.config
├Form1.cs
.
.
.

という階層にし、(imgフォルダのみ自作)imgフォルダ直下に画像icon.jpgを配置しています。
キメ打ちではなく、動かす場所に合わせてこの場所をフルパス指定したいです。
色々と調べては見たのですが、実行ファイルのフォルダ((省略)(プロジェクトフォルダ)\bin\x86\Debugbin\x86\Debug)を取得するものしか見つけることが出来ませんでした。

多くの人がそれぞれ自分の環境で使う為、出来ればどこかに設定を持たせる方法ではなく、動的に取得できるとありがたいです。

何か良い方法をご存知の方いらっしゃいましたらよろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

papinianus

2019/06/03 01:39

質問文を、ユーザが自由な場所に自由な画像を置く、という要件で理解しました。だとすると、ユーザはどのように画像を指定するのでしょうか?
dev3310

2019/06/03 02:17

プログラムをユーザが自由な場所に配置するということで、画像自体はこちらが用意したものを使用するようになっています。
退会済みユーザー

退会済みユーザー

2019/06/03 02:27

> プログラムをユーザが自由な場所に配置するということで、画像自体はこちらが用意したものを使用するようになっています。 であれば、私が回答で書いたように画像をリソースとして埋め込めば解決するのではないですか。
guest

回答4

0

icon.jpg がフォルダの構成に関わらず取得できれば良いのですか?

であれば、リソースとして埋め込んではいかがですか? 具体的には以下の記事を見てください。

画像やテキストファイルを実行ファイルに埋め込む
https://dobon.net/vb/dotnet/programing/bitmapresource.html

投稿2019/06/03 02:04

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dev3310

2019/06/03 02:34

私が質問に書き忘れてしまい大変申し訳ないのですが、今回は連携するソフトの関係で、パスを文字列として取得する必要がありました。 その為ベストアンサーは別の方にさせていただきますが、大変勉強になりました。 今後この方法も別の機会に使用させていただこうと思います。 有難うございます。
guest

0

ベストアンサー

プロジェクトフォルダは実行ファイルから取得するものではありません。ソリューションエクスプローラーで画像を右クリックしてプロパティを開き、「ビルドアクション」を「コンテンツ」に、「出力ディレクトリにコピー」を「新しい場合はコピーする」にしてください。そうすればビルド時に bin 以下にコピーされるようになります。

投稿2019/06/03 01:08

Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dev3310

2019/06/03 02:38

ご提案いただいた方法で解決することが出来ました。ありがとうございます。 初めてのWindowsForms故仕組みが良くわかっておらず、大変助かりました。
guest

0

Applicatin.ExecutablePath が、アプリケーションを開始した実行可能ファイルのフルパスです。
プロジェクトフォルダは、実行環境にはありませんよ。imgに置いたファイルの、VS上のプロパティで、「出力ディレクトリにコピー」を「コピーしない」以外にします。

投稿2019/06/03 01:47

Q71

総合スコア995

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dev3310

2019/06/03 02:40

ご提案いただいた方法で解決することが出来ました。 頂いた方法が他の方と同じだった為、わずかな差ではありますが、今回は早く回答を下さった方をベストアンサーに選ばせていただきました。申し訳ありません。 初めてのWindowsFormsで実行ファイルとの関係等よく解っていませんでしたので大変助かりました。 これからもっと勉強したいと思います。
guest

0

「C# 相対パス フルパス」でぐぐってみましょう

投稿2019/06/03 00:47

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dev3310

2019/06/03 01:00

検索はしたのですが、 実行ファイルがある(省略)(プロジェクトフォルダ)\bin\x86\Debug\bin\x86\Debug から相対的にimgまでさかのぼって、それをSystem.IO.Path.GetFullPathなどでフルパス変換するということでしょうか。 プラットフォームをx64にしたり、Releaseにしたりすると実行ファイルがあるパスが変わってしまうなと思い、 直接プロジェクトフォルダが取得できる方法を考えているのですが、やはり難しいですかね。
y_waiwai

2019/06/03 01:43

ああ、もしかして、画像ファイルのフルパスを得る、ってのが目的ではなくて、実行ファイルから画像ファイルをどうやって指定するのかという話でしょうか それなら、本番時(デバッグ時にではなく)に、その実行ファイルと画像ファイルをどう配置するのか、を決める必要があります。 それが決まれば、フルパスを得ずとも、実行ファイルからの相対パスでアクセスすることができます それなら、 「C# カレントディレクトリ 相対パス」でぐぐればしあわせになれますね
dev3310

2019/06/03 02:36

いえ、フルパスの取得が目的でした。 勉強不足かつ説明ベタで申し訳ありません。
y_waiwai

2019/06/03 03:00

相対パスがわかれば、フルパスにできますね
papinianus

2019/06/03 10:06

私はこのy_waiwai様の2つ上のコメントがBAだと思うのですが。 逆にzuishin様の回答は質問者様の要件には合わないと思います
dev3310

2019/06/04 01:26

>papinianus様 あまりちゃんと理解できておらず申し訳ありません。 私としては、実行ファイルがある場所はプラットフォームにより変わってしまう恐れがある為、実行ファイルからの相対パスを用いてフルパスを表現するのはやめておこうかなと思いました。 zuishin様の回答の方法であれば、ビルドの際に実行ファイルがある場所に出力される為問題ないかと思っていたのですが、違うのでしょうか。
Zuishin

2019/06/17 04:37

要件の解釈に少し悩みましたが、質問に書いてあるディレクトリにソースが含まれていたのと、bin ディレクトリの取得はわかるようだったので、フルパスと相対パスの問題ではなく、ソースの置かれたディレクトリを実行中に取得したいという質問と判断しました。 しかしソースの置かれたディレクトリを実行中に使うのは好ましくないので、別の方法を提案しました。
papinianus

2019/06/17 08:34

Zuishin様 > ソースの置かれたディレクトリを実行中に取得したいという質問 この解釈に至ることができませんでした。コメント感謝します。 ビルド時にコピーは適切な対応だと思いますが、どこにあるのであれ「本番時(デバッグ時にではなく)に、その実行ファイルと画像ファイルをどう配置するのか、を決める必要があります」が正解に思えました。
Zuishin

2019/06/17 09:10

その通りだと思います。それを実現する具体的な方法がビルド時にビルドディレクトリへコピーすることと認識しています。 「C# カレントディレクトリ 相対パス」でググっても、その結果たどり着くのはカレントディレクトリに依存した相対パスの取得方法でしょうが、実際にカレントディレクトリがどこになるのかは実行時に決まることです。それでは、たとえばパスを通してコマンドラインから実行した場合など、カレントディレクトリが変わったときに対応できません。 実行ファイルを基準として、それと同じディレクトリもしくはその配下のディレクトリにリソースをインストールすれば、実行ファイルのパスからリソースの位置を割り出せるので、柔軟に対応できます。ビルドアクションをコンテンツにするというのはそういう意味です。
Zuishin

2019/06/17 09:12

ですから、キーワードに「カレントディレクトリ」がある限り、この回答を支持することはできません。
Zuishin

2019/06/17 09:13

また「C# 相対パス フルパス」もカレントディレクトリを視野に入れたものと判断せざるを得ませんし、その方向で調べてこの問題が解決したとも思いません。
papinianus

2019/06/17 09:57

ようやく理解できたと思います。 カレントディレクトリを実行バイナリのある場所とゆるく捉えてました。バイナリの実行時のワーキングディレクトリとして用語として区別された意味を持つ言葉でした。認識をあらたにします。またクライアントアプリとしての作りにも理解が不十分でした。 ご丁寧なコメント、大変感謝します。 質問者様、混乱させて申し訳なかったです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問