tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトル画像の上書き保存
記事No4495
投稿日: 2006/11/05(Sun) 19:22
投稿者
いつもお世話になっています。
下のようなコードで、上書き保存をしようと思います。
しかし、コードのbeforeimage.Save(afterimage)の部分で、externalexceptionのハンドルがスローされ、
「GDI+で汎用エラーが発生しました。」となってしまいます。
ファイルを削除するところまではできるのです。
普通に名前をつけて保存のほうでは、例外が出ません。
なぜ上書き保存のときだけ、エラーが出てしまうのでしょうか?
上書き保存と名前をつけて保存のコードを書いておきます。

'上書き保存
Private Sub 上書き保存SToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e _
As System.EventArgs) Handles 上書き保存SToolStripMenuItem.Click, ToolStripButton3.Click
        Dim beforeimage As Image = PictureBox1.Image
        Dim afterimage As String = OpenFileDialog1.FileName
        OpenFileDialog1.Dispose()
        OpenFileDialog1.FileName = Nothing
        PictureBox1.Image = Nothing
        File.Delete(afterimage)
        beforeimage.Dispose()
        beforeimage.Save(afterimage)
    End Sub

'名前をつけて保存
Private Sub 名前をつけて保存AoolStripMenuItem_Click(ByVal sender As System.Object, ByVal e _
As System.EventArgs) Handles 名前を付けて保存AoolStripMenuItem.Click, ToolStripButton2.Click
        If SaveFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then
            PictureBox1.Image.Save(SaveFileDialog1.FileName)
        End If
        Application.DoEvents()
    End Sub

よろしくお願いします。

[ツリー表示へ]
タイトルRe: 画像の上書き保存
記事No4496
投稿日: 2006/11/05(Sun) 23:28
投稿者YAS
的外れかもしれませんが...

ファイルの削除の処理が終わる前に保存しようとしているのでは?
ファイルを削除した跡に,一定の時間を置くとか,ファイルの削除が完了したことをか確認したら
どうでしょう?

[ツリー表示へ]
タイトルRe: 画像の上書き保存
記事No4497
投稿日: 2006/11/05(Sun) 23:45
投稿者花ちゃん
> 「GDI+で汎用エラーが発生しました。」となってしまいます。
> ファイルを削除するところまではできるのです。
> 普通に名前をつけて保存のほうでは、例外が出ません。
> なぜ上書き保存のときだけ、エラーが出てしまうのでしょうか?
> 上書き保存と名前をつけて保存のコードを書いておきます。


単に、保存する前に消して、メモリを解放しているからでは。
(下記の順番が逆)
        PictureBox1.Image = Nothing
        File.Delete(afterimage)
        beforeimage.Dispose()
        beforeimage.Save(afterimage)
    End Sub

---------------------------------------------------
http://hanatyan.sakura.ne.jp/dotnet/zu03.htm

 ’上書きするなら削除する必要がないのでは。
      ’File.Delete(afterimage)

    '表示している間に保存しないと。
        beforeimage.Save(afterimage)

        '下記も逆にするとエラーが発生する
        beforeimage.Dispose()
        PictureBox1.Image = Nothing
    End Sub

[ツリー表示へ]
タイトルRe^2: 画像の上書き保存
記事No4498
投稿日: 2006/11/06(Mon) 01:05
投稿者YAS
> 単に、保存する前に消して、メモリを解放しているからでは。

あら,本当だ。よく読みもしないでコメントして申し訳ありません。

[ツリー表示へ]
タイトルRe^2: 画像の上書き保存
記事No4502
投稿日: 2006/11/06(Mon) 19:03
投稿者
> 単に、保存する前に消して、メモリを解放しているからでは。
メモリを解放しているだけでは、だめなのですか。
一応ファイルは、FileStreemを使って開いていますし、
資料を探したときに見たあるサイトでは、Filestreemを使うことで、
上書き処理ができるというのを見ました。
どういったコード(メソッド)を使うことによって上書き保存ができるんでしょうか。

[ツリー表示へ]
タイトルRe^3: 画像の上書き保存
記事No4503
投稿日: 2006/11/06(Mon) 19:27
投稿者魔界の仮面弁士
今回の件とは関係ありませんが、beforeimage と afterimage が、変数名は対称的なのに、
型がまったく異なる点に、すこぶる違和感を感じます……。


> > 単に、保存する前に消して、メモリを解放しているからでは。
> メモリを開放いているだけでは、だめなのですか。

いや、解放(≠開放)したからまずいのでは。

画像データ(Image)を保存(Save)しようと思ったら、それは既に処分(Dispose)されていたので、
処理に失敗した、という事だと思いますけれども。処分される前に保存しないと。


> どういったコード(メソッド)を使うことによって上書き保存ができるんでしょうか。
それについては、すでに具体的な回答が付いているのでは無いでしょうか。

提示された情報では解決できなかったのであれば、それを試して/調べてみた結果、
どのような結果になるのかを示して頂かないと、会話が進みにくくなってしまうかと。

[ツリー表示へ]
タイトルRe^4: 画像の上書き保存
記事No4504
投稿日: 2006/11/06(Mon) 21:10
投稿者
> 画像データ(Image)を保存(Save)しようと思ったら、それは既に処分(Dispose)されていたので、
> 処理に失敗した、という事だと思いますけれども。処分される前に保存しないと。

わかりました。
皆さんありがとうございました。

[ツリー表示へ]