tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルファイルの操作で例外が出てしまう
記事No4396
投稿日: 2006/10/07(Sat) 23:24
投稿者
今、起動時にアプリと同じ場所に、フォルダを作成し、終了時に、削除するようにしています。
そのファイルには、PictureBoxに読み込ませている画像があります。
しかし、終了時に、「別のプロセスが使用しているためアクセスできませんとなっています。
コードは、下のとうりになっています。どこをどう直せばいいでしょうか?
Private Sub Form1_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) _
        Handles MyBase.Closing
        If MsgBox("終了していいですか?未保存ファイルは保存されません。よろしいですか?" _
        , MsgBoxStyle.YesNo + MsgBoxStyle.Exclamation _
                        + MsgBoxStyle.DefaultButton2, "CAD Writer") = MsgBoxResult.No Then
            e.Cancel = True
        Else
            PictureBox1.Image = Nothing
            System.IO.Directory.Delete(Application.StartupPath & "\UnReSetting", True / False)
        End If
    End Sub

[ツリー表示へ]
タイトルRe: ファイルの操作で例外が出てしまう
記事No4397
投稿日: 2006/10/08(Sun) 02:07
投稿者魔界の仮面弁士
> そのファイルには、PictureBoxに読み込ませている画像があります。

それが原因かも知れません。

画像を読み込ませる時に、開発環境から直接ファイルを指定したり、あるいは
 PictureBox1.Image = Image.FromFile("C:\foo.jpg")
などとすると、そのファイルが使用中のままになってしまいます。

かわりに、
 Dim fs As New FileStream("C:\foo.jpg", FileMode.Open, FileAccess.Read)
 PictureBox1.Image = Image.FromStream(fs)
 fs.Close()
などのように、一度 Stream 系クラスに読み込んでから、Image.FromStream してみてください。

http://support.microsoft.com/kb/309482/ja

[ツリー表示へ]
タイトルわかりました。
記事No4398
投稿日: 2006/10/08(Sun) 10:11
投稿者
わかりました。
ありがとうございました。

[ツリー表示へ]
タイトルたびたびすみません
記事No4409
投稿日: 2006/10/11(Wed) 20:19
投稿者
たびたびすみません。
>かわりに、
(中略)(No.4397)
>などのように、一度 Stream 系クラスに読み込んでから、Image.FromStream してみてください。
というので、やってみたら、初期の、フォルダの削除のほうはできました。
この方法で、上書き保存をやってみたいのですがうまくいきません。
上書き保存をするとき以下のコードを使っています。
Dim reimg As String = Application.StartupPath & "\rememory.tif"
Dim reimg2 As String = OpenFileDialog1.FileName
PictureBox1.Image.Save(Application.StartupPath & "\rememory.tif")
PictureBox1.Image = Nothing
PictureBox1.Dispose()
OpenFileDialog1.Dispose()
File.Delete(OpenFileDialog1.FileName)
File.Move(reimg, reimg2)
例外の詳細を見てみると、File.Move(reimg, reimg2)のところで、パスへのアクセスが拒否されました。
という例外の内容でした。
stream系を読み込ませても出てくるのですが、どうしたらいいでしょうか?

[ツリー表示へ]
タイトルRe: たびたびすみません
記事No4412
投稿日: 2006/10/12(Thu) 22:47
投稿者魔界の仮面弁士
> Dim reimg As String = Application.StartupPath & "\rememory.tif"
今回の件とは関係ありませんが、このような処理を行う場合には、
System.IO.Path の Combine メソッドで連結した方が良いかと思います。

それと、StartupPath に対する書き込みは、あまりおすすめできません。
テストコードという事であれば良いですが、実際のアプリでそのように組み込むと、
マルチユーザログオン時に競合がおきやすいですし、ログオンしたユーザによっては、
StartupPath に対する書き込みが許可されていない事もありますから。


> PictureBox1.Image = Nothing
> PictureBox1.Dispose()

当方では試していないので、当てにはなりませんが、Dispose が必要なのは、
PictureBox よりも、むしろ Image の方だと思います。たとえば、これだとどうでしょう?
  'for VB2005
 Using oldImage As Image = PictureBox1.Image
    PictureBox1.Image = Nothing
  End Using

# 試していないので、動作するかどうかは保障しません。(^_^;)
# あくまで概念的な話という事で…。

> File.Move(reimg, reimg2)
> 例外の詳細を見てみると、File.Move(reimg, reimg2)のところで、パスへのアクセスが拒否されました。
具体的には、どの例外ですか? (メッセージではなく、Exception のクラス名)
http://msdn2.microsoft.com/ja-jp/library/system.io.file.move.aspx

また、例外発生時に、reimg および reimg2 で示されたパスについて、エクスプローラから
手動で操作してみた場合、移動のみが拒否されるのでしょうか。それとも、コピーも拒否されますか?

[ツリー表示へ]
タイトルRe^2: たびたびすみません
記事No4421
投稿日: 2006/10/13(Fri) 21:35
投稿者
返事が遅くなりすみません。
>具体的には、どの例外ですか? (メッセージではなく、Exception のクラス名)
UnauthorizedAccessExceptionという例外でした。
>また、例外発生時に、reimg および reimg2 で示されたパスについて、エクスプローラから
>手動で操作してみた場合、移動のみが拒否されるのでしょうか。それとも、コピーも拒否されますか?
試してみたところ、移動はできましたが、Reimg2(移動先ファイル名)のファイル名に変更したところ、ファイルまたはフォルダ名の変更エラー(内容 rememoryの名前を変更できません。
アクセスできません。ディスクがいっぱいでないか、書込み禁止になっていないか、
またはファイルが使用中でないか確認してください。)
が出てきました。
後ひとつ質問です。
>Using oldImage As Image = PictureBox1.Image
>    PictureBox1.Image = Nothing
>End Using
これは、
PictureBox1.Image = Nothing
PictureBox1.Dispose()
のコードを置き換えてみたほうが良いということでしょうか?
いまいちそのあたりがわからなかったので聞いてみました。

>今回の件とは関係ありませんが、このような処理を行う場合には、
>System.IO.Path の Combine メソッドで連結した方が良いかと思います。
こちらは理解しました。
置き換えておきます。
いろいろとお教えいただきありがとうございます。

[ツリー表示へ]
タイトルRe^3: たびたびすみません
記事No4422
投稿日: 2006/10/13(Fri) 22:24
投稿者魔界の仮面弁士
>> 具体的には、どの例外ですか? (メッセージではなく、Exception のクラス名)
> UnauthorizedAccessExceptionという例外でした。

その例外は、『呼び出し元に、必要なアクセス許可がありません。』という意味だそうです。
http://msdn2.microsoft.com/ja-jp/library/system.io.file.move.aspx

となると、ファイルが使用中でロックされているから上書きできない…という事だけではなく、
アプリケーションの実行ユーザ(Windowsへのログオンユーザではなく)が、そのファイルへの
書き込み権限を持っていない(読み込みは可)という可能性もありえそうです。
念のため、セキュリティ関係の設定も確認してみてください。


> >Using oldImage As Image = PictureBox1.Image
> >    PictureBox1.Image = Nothing
> >End Using

このコードを、(VB2005 ではなく)VB.NET 2002/2003 で書くなら、このようになります。
 Dim oldImage As Image = PictureBox1.Image
 Picture1.Image = Nothing
 oldImage.Dispse()

> これは、
> PictureBox1.Image = Nothing
> PictureBox1.Dispose()
> のコードを置き換えてみたほうが良いということでしょうか?
そういう意味です。

もし、Image クラスがファイルをロックしているのだと仮定すれば、Dispose を本当に
必要としているのは、PictureBox クラスではなく、Image クラスの方かな、という事です。

それに、その PictureBox は、親フォームの Controls にまだ登録されたままでしょうから、
フォームに断りも無く PictureBox を勝手に Dispose するのは、問題があるでしょうしね。

[ツリー表示へ]
タイトルRe^4: たびたびすみません
記事No4423
投稿日: 2006/10/13(Fri) 22:42
投稿者
> となると、ファイルが使用中でロックされているから上書きできない…という事だけではなく、
> アプリケーションの実行ユーザ(Windowsへのログオンユーザではなく)が、そのファイルへの
> 書き込み権限を持っていない(読み込みは可)という可能性もありえそうです。
> 念のため、セキュリティ関係の設定も確認してみてください。
書き込み権限を持っていないとのことでしたが、
使っているPCのユーザーアカウントはみな管理者権限なのですが…。
この例外が出ないようにするには、PCのセキュリティ設定のほかにどんな方法があるでしょうか?

[ツリー表示へ]
タイトルRe^5: たびたびすみません
記事No4424
投稿日: 2006/10/13(Fri) 23:17
投稿者魔界の仮面弁士
> 書き込み権限を持っていないとのことでしたが、
持っていない可能性がある、という、あくまで、可能性のひとつとしての話ですけれどね。
ファイルがロックされている可能性も捨て切れないと思います。

もし、常に書き込みができないのであれば、権限まわりの可能性が高くなりますし、
ある特定の処理を行った時だけ書き込みができなくなるのであれば、権限まわりよりも、
ファイルがロックされている可能性の方が高くなってくると思います。


> > アプリケーションの実行ユーザ(Windowsへのログオンユーザではなく)が、そのファイルへの
> 使っているPCのユーザーアカウントはみな管理者権限なのですが…。
どのユーザでログオンしているかは重要ではなく、アプリの実行ユーザの権限がどうなって
いるのか、という事が重要になってきます。たとえば WinXP の場合、exeの右クリックメニューに
「別のユーザとして実行」という項目があったりしますし、それに相当する API もあるわけで。

もっとも、特に指定してなければ、ログオンユーザ=実行ユーザですから、今回の場合は
Administrator 権限で動作しているとは思います。


そうした NTFS / Windows アカウントの設定に加えて、アセンブリの配置先などといった
.NET 側のセキュリティ設定についても、確認しておいた方が良いと思います。
http://www.gotdotnet.com/japan/team/clr/about_security.aspx


>>> UnauthorizedAccessExceptionという例外でした。
> この例外が出ないようにするには、PCのセキュリティ設定のほかにどんな方法があるでしょうか?
まずは、トラブルシューティング ページの内容をチェックしてみてください。
http://msdn2.microsoft.com/ja-jp/library/18b8kx07.aspx

[ツリー表示へ]
タイトルRe^6: たびたびすみません
記事No4425
投稿日: 2006/10/13(Fri) 23:51
投稿者
>>> UnauthorizedAccessExceptionという例外でした。
> この例外が出ないようにするには、PCのセキュリティ設定のほかにどんな方法があるでしょうか?
>まずは、トラブルシューティング ページの内容をチェックしてみてください。
>http://msdn2.microsoft.com/ja-jp/library/18b8kx07.aspx
とりあえずここを参照してみます。

[ツリー表示へ]