トップ回答者
エラーの回避

質問
-
使っているVBバージョンは2013ですwindows8.1で勉強しています。お教えください
Dim g As Graphics = PictureBox1.CreateGraphics
Dim b As New TextureBrush(Image.FromFile("C:¥winnt¥隅田川.bmp")) →この部分がたとえば(“G:¥画像¥kasaburanka2.jpg")
だったらエラーになります何がが間違っているのですがわかりません
g.FillEllipse(b, 0, 0, 200, 200)
End Sub
型 'System.IO.FileNotFoundException' のハンドルされていない例外が System.Drawing.dll で発生しました 追加情報:G:\画像\kasaburanka2.jpgに一致するウェブページは見つかりませんでした。
このように表示されます
このエラーを回避するには何が必要ですか。
(”C:¥windows¥kasaburanka2.bmp")とすると読み込まれます
回答
-
FileNotFoundException とのことですので、そのファイルが存在しないか、指定したパスが誤っている可能性が考えられます。
指定したパスが誤っていないか、もう一度確認してみては如何でしょう。それと、CreateGraphics (あるいは Graphics.FromImage) を使うのであれば、描画終了後に、生成した Graphics を g.Dispose() などとして破棄する必要があります。TextureBrush や Image も同様ですね。
特に FromFile を使っている場合、その Image が解放されるまで、ファイルがロックされたままの状態になってしまいますので、Dispose 処理は重要です。
Using g = PictureBox1.CreateGraphics() Using img = Image.FromFile(ファイルパス) Using b As New TextureBrush(img) g.FillEllipse(b, 0, 0, 200, 200) End Using End Using End Using
- 編集済み 魔界の仮面弁士MVP 2015年5月15日 5:08
- 回答の候補に設定 星 睦美 2015年5月19日 1:36
- 回答としてマーク 星 睦美 2015年5月21日 7:15
-
Dim b As New TextureBrush(Image.FromFileDim b As New TextureBrush(Image.FromFile("C:¥winnt¥隅田川.bmp"))
隅田川.bmp というファイルは、Vista 以降には存在しない、Windows 2000 や XP 時代の壁紙だったと記憶しています。
ましてや、Windows 8.1 を使いつつも winnt というフォルダーがあるということは、バージョンアップ版の OS を使っていることになtってしまいそうですが…とりたてて古い環境を使い続けて開発しているわけではなく、参考にしていたコードがそういうパスだった、というだけなのですよね?以下、私なりの考察:
- パスが『全角』だった可能性について
- 質問文ではコロン「:」が全角「:」になっていましたが、引用頂いたエラーメッセージは半角のパスになっているので、実際には半角のパスであったものと想像しています。
- とはいえ、質問文と引用したエラーでパスが違っている以上、疑ってかかるべき…?
- ASP.NET Webアプリという可能性について
- PictureBox1.CreateGraphics している以上、ほぼ間違いなく Windows Forms なアプリケーションでしょうね。
- そもそも Web アプリで Image.FromFile を使おうとすれば、参照設定や名前空間の解決が必要になってしまうはずなので、ASP.NET であるとは考えにくいです。
- 例外メッセージが「一致するウェブページは見つかりませんでした。」なのが不自然?
- FileNotFoundException にしては、日本語メッセージが不自然な気がしています。
- とはいえ、Image.FromFile は URI フォーマットをサポートしていないので、本当に Web ページを探しに行っているのでは無いはず…?
別の章でもファイルG:はやはり表示されませんでした。
「章」ってなんでショウ?(もしかして、VB中学校のサイトを参考にされているのかな…)
試しに「C:\windows\kasaburanka2.bmp」ファイルを置いて試すと表示されます。外付けのUSBに入れてあるファイルが「G:¥画像\kasaburanka2.jpg」なのでこれが表示されません。
相変わらず、「半角の\」と「全角の¥」が混在しているのが気になりました。
(掲示板投稿時にバックスラッシュ「\」で表示されてしまうのは、設定されたフォントの都合によるものなので、気にしないでも大丈夫です)権限の調査についてですが、コピー後のファイルを右クリックしてプロパティを調べ、G ドライブのファイルと C ドライブのファイルで、プロパティの「セキュリティ」タブに差異が無いかどうか、念のために確認してみて下さい。
というのも、ファイルを「コピー」した場合と、ファイルを「移動」した場合とでは、アクセス権の適用方法が異なるためです(コピーしたファイルと移動したファイルの両方で試してみるのも良いでしょう)。
また、懸念されていたパスの入力ミスについてですが、これは、エクスプローラーにて [Shift キーを押しながらマウスを右クリック] するのが良いでしょう。こうすると、コンテキストメニューに『パスとしてコピー』が現れますので、それを使ってパスを貼り付けることで、正確なパスを記載できるはずです。
- パスが『全角』だった可能性について
すべての返信
-
FileNotFoundException とのことですので、そのファイルが存在しないか、指定したパスが誤っている可能性が考えられます。
指定したパスが誤っていないか、もう一度確認してみては如何でしょう。それと、CreateGraphics (あるいは Graphics.FromImage) を使うのであれば、描画終了後に、生成した Graphics を g.Dispose() などとして破棄する必要があります。TextureBrush や Image も同様ですね。
特に FromFile を使っている場合、その Image が解放されるまで、ファイルがロックされたままの状態になってしまいますので、Dispose 処理は重要です。
Using g = PictureBox1.CreateGraphics() Using img = Image.FromFile(ファイルパス) Using b As New TextureBrush(img) g.FillEllipse(b, 0, 0, 200, 200) End Using End Using End Using
- 編集済み 魔界の仮面弁士MVP 2015年5月15日 5:08
- 回答の候補に設定 星 睦美 2015年5月19日 1:36
- 回答としてマーク 星 睦美 2015年5月21日 7:15
-
>(“G:¥画像¥kasaburanka2.jpg")
このコロン「:」が全角のようですが、プログラムではきちんと半角でしょうか?
#スレッドのタイトルはもう少し具体的に書かれるとよいです。例えば、「Image.FromFileで特定の画像ファイルが読み込めません」のようにです。現在のスレッドタイトルである「エラーの回避」は抽象すぎて、ご質問内容をスレッドタイトルから想像することが難しくなっています。
よろしくお願いいたします。★良い回答には回答済みマークを付けよう! MVP - .NET http://d.hatena.ne.jp/trapemiya/
-
moriuchi さま よろしく。
魔界の仮面弁士 さまがお書きになった通りなのですが、その意味が分りますか?。
重要な事なので、理解するまで調べてみましょう。
さて、ファイルを指定して、存在しないエラーで困られていると。
きっと、学習用のサンプルプログラムなんでしょうが、
エラーを回避するには何が必要か には、幾通りかの書き方がありますね。
1.存在するパスを確認して正確に書く
2.ファイルの存在を確認して、ある場合のみ、次の処理に進む
3.例外処理を盛り込む
今は、ハードコードで、ファイル名をソースに埋め込まれているのだと思いますが、
きっと、その次は、変数かコントロールの値を使うのではないですか。
ですから、こんな感じで。 Dim fileBrush As String を別の場所で宣言し値をセットしたとします。
'Dim fileBrush As String = "C:¥winnt¥隅田川.bmp" 参考 If System.IO.File.Exists(fileBrush) '以下に処理を書く END IF
-
ありがとうございます。指定したパスがすべて半角で打っているかを確認します。
CreateGraphics (あるいは Graphics.FromImage) を使うのであれば、描画終了後に、生成した Graphics を g.Dispose() などとして破棄する必要があります。TextureBrush や Image も同様ですね。
特に FromFile を使っている場合、その Image が解放されるまで、ファイルがロックされたままの状態になってしまいますので、Dispose 処理は重要です。→この部分はわかりませんでした。再度チェックしてみます。ありがとうございます。
-
ありがとうございます。
「G:¥画像」ディレクトリにアクセス権が無いケースもあり得ます。→試しに「C:\windows\kasaburanka2.bmp」ファイルを置いて試すと表示されます。外付けのUSBに入れてあるファイルが「G:¥画像\kasaburanka2.jpg」なのでこれが表示されません。
別の章でもファイルG:はやはり表示されませんでした。
型 'System.IO.FileNotFoundException' のハンドルされていない例外が System.Drawing.dll で発生しました 追加情報:G:\画像\kasaburanka2.jpgに一致するウェブページは見つかりませんでした。
再度半角で打ち込んでいるかをチェックしてみます。
-
Dim b As New TextureBrush(Image.FromFileDim b As New TextureBrush(Image.FromFile("C:¥winnt¥隅田川.bmp"))
隅田川.bmp というファイルは、Vista 以降には存在しない、Windows 2000 や XP 時代の壁紙だったと記憶しています。
ましてや、Windows 8.1 を使いつつも winnt というフォルダーがあるということは、バージョンアップ版の OS を使っていることになtってしまいそうですが…とりたてて古い環境を使い続けて開発しているわけではなく、参考にしていたコードがそういうパスだった、というだけなのですよね?以下、私なりの考察:
- パスが『全角』だった可能性について
- 質問文ではコロン「:」が全角「:」になっていましたが、引用頂いたエラーメッセージは半角のパスになっているので、実際には半角のパスであったものと想像しています。
- とはいえ、質問文と引用したエラーでパスが違っている以上、疑ってかかるべき…?
- ASP.NET Webアプリという可能性について
- PictureBox1.CreateGraphics している以上、ほぼ間違いなく Windows Forms なアプリケーションでしょうね。
- そもそも Web アプリで Image.FromFile を使おうとすれば、参照設定や名前空間の解決が必要になってしまうはずなので、ASP.NET であるとは考えにくいです。
- 例外メッセージが「一致するウェブページは見つかりませんでした。」なのが不自然?
- FileNotFoundException にしては、日本語メッセージが不自然な気がしています。
- とはいえ、Image.FromFile は URI フォーマットをサポートしていないので、本当に Web ページを探しに行っているのでは無いはず…?
別の章でもファイルG:はやはり表示されませんでした。
「章」ってなんでショウ?(もしかして、VB中学校のサイトを参考にされているのかな…)
試しに「C:\windows\kasaburanka2.bmp」ファイルを置いて試すと表示されます。外付けのUSBに入れてあるファイルが「G:¥画像\kasaburanka2.jpg」なのでこれが表示されません。
相変わらず、「半角の\」と「全角の¥」が混在しているのが気になりました。
(掲示板投稿時にバックスラッシュ「\」で表示されてしまうのは、設定されたフォントの都合によるものなので、気にしないでも大丈夫です)権限の調査についてですが、コピー後のファイルを右クリックしてプロパティを調べ、G ドライブのファイルと C ドライブのファイルで、プロパティの「セキュリティ」タブに差異が無いかどうか、念のために確認してみて下さい。
というのも、ファイルを「コピー」した場合と、ファイルを「移動」した場合とでは、アクセス権の適用方法が異なるためです(コピーしたファイルと移動したファイルの両方で試してみるのも良いでしょう)。
また、懸念されていたパスの入力ミスについてですが、これは、エクスプローラーにて [Shift キーを押しながらマウスを右クリック] するのが良いでしょう。こうすると、コンテキストメニューに『パスとしてコピー』が現れますので、それを使ってパスを貼り付けることで、正確なパスを記載できるはずです。
- パスが『全角』だった可能性について
-
お世話になります。
型 'System.IO.FileNotFoundException' のハンドルされていない例外が System.Drawing.dll で発生しました 追加情報:G:\画像\kasaburanka2.jpgに一致するウェブページは見つかりませんでした。→まだくわしく理解できていませんのでもう少し勉強してから確認いたします
それと、CreateGraphics (あるいは Graphics.FromImage) を使うのであれば、描画終了後に、生成した Graphics を g.Dispose() などとして破棄する必要があります。TextureBrush や Image も同様ですね。
特に FromFile を使っている場合、その Image が解放されるまで、ファイルがロックされたままの状態になってしまいますので、Dispose 処理は重要です。↓↓下記の部分はどこに記述すればいいのかもよくわかっていません。かんたんに質問することは良く調べた後でどうしてもわからない時にさせていただくようにします
Using g = PictureBox1.CreateGraphics() Using img = Image.FromFile(ファイルパス) Using b As New TextureBrush(img) g.FillEllipse(b, 0, 0, 200, 200) End Using End Using End Using