tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルFileOpenは使用しないほうがいい?
記事No7377
投稿日: 2008/04/21(Mon) 18:22
投稿者皐月
こんにちはお世話になっております。VB2005にて開発を行っております。
VB6.0からの移行で以下のようなソースを記述しました。
一応問題なく動作するのですが、「.ShowDialog()」で保存をするウィンドウを開いてキャンセルをしたときにFileOpenの部分で「パス/ファイル アクセス エラー」と警告が表示され、イミディエイトウィンドウで「'System.IO.IOException' の初回例外がMicrosoft.VisualBasic.dll で発生しました。」と表示されます。

一応例外処理は記述してあるので問題ないとは思っているのですが、イミディエイトウィンドウの表示や例外設定の設定によっては毎回かかるので少々気になっています。
この警告は消えることはないのでしょうか?

msdnのHPを見ますと、FileOpenの代わりに.Netから「My.Computer.FileSystem オブジェクト」が推奨されていることを知ったのですが、こちらを使用したら解決されるのでしょうか?このままFileOpenを使用していってもよいのか少し悩んでおります。
どうかアドバイスをお願いします。

    Private Sub Menu_Save_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Menu_Save.Click

        Dim Freenumber As String

        With SaveFileDialog1
            Try
                ChDrive(My.Application.Info.DirectoryPath)
                ChDir(My.Application.Info.DirectoryPath & "\Setdata")
                .ShowDialog()

                Freenumber = CStr(FreeFile())
                FileOpen(CInt(Freenumber), .FileName, OpenMode.Output)
                'データ保存
                      ・
                      ・
           ・
                FileClose(CInt(Freenumber))
                Exit Sub

            Catch ex As System.IO.IOException
                ChDrive(My.Application.Info.DirectoryPath)
                ChDir(My.Application.Info.DirectoryPath & "\Setdata")
            End Try
        End With

    End Sub

[ツリー表示へ]
タイトルRe: FileOpenは使用しないほうがいい?
記事No7379
投稿日: 2008/04/21(Mon) 19:24
投稿者花ちゃん
> 一応問題なく動作するのですが、「.ShowDialog()」で保存をするウィンドウを開いてキャンセルをしたときにFileOpenの部分で「パス/ファイル アクセス エラー」と警告が表示され、イミディエイトウィンドウで「'System.IO.IOException' の初回例外がMicrosoft.VisualBasic.dll で発生しました。」と表示されます。

SaveFileDialog1 でのファイル名の取得の仕方に問題があるからです。
ここの Tips集の ダイアログのところを参考にして正しいファイル名を取得してから
使用するようにして見て下さい。

>Dim Freenumber As String
>Freenumber = CStr(FreeFile())
>FileClose(CInt(Freenumber))
上記も何をしようとしているのか? 何をしたいのかを 1行・1行 MSDN 等を調べながら
書き進めるようにして下さい。

[ツリー表示へ]
タイトルRe^2: FileOpenは使用しないほうがいい?
記事No7382
投稿日: 2008/04/22(Tue) 09:50
投稿者皐月
花ちゃんさん返信ありがとうございます。
.FlieNameの取得はOKボタンが押されたときのみ、ユーザーが設定したファイル名を保存できるようになっているので、If .ShowDialog() = Windows.Forms.DialogResult.OK Thenを追加して、.FileNameが取得できたときのみ、FileOpenの処理ができるように変更しました。  

Private Sub Menu_Save_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Menu_Save.Click

        Dim Freenumber As String

        With SaveFileDialog1
            Try
                ChDrive(My.Application.Info.DirectoryPath)
                ChDir(My.Application.Info.DirectoryPath & "\Setdata")
                If .ShowDialog() = Windows.Forms.DialogResult.OK Then ←これを追加しました


                Freenumber = CStr(FreeFile())
                FileOpen(CInt(Freenumber), .FileName, OpenMode.Output)
                'データ保存
                      ・
                      ・
           ・
                FileClose(CInt(Freenumber))
                Exit Sub
                end if

            Catch ex As System.IO.IOException
                ChDrive(My.Application.Info.DirectoryPath)
                ChDir(My.Application.Info.DirectoryPath & "\Setdata")
            End Try
        End With

    End Sub

[ツリー表示へ]
タイトルRe^3: FileOpenは使用しないほうがいい?
記事No7387
投稿日: 2008/04/22(Tue) 16:24
投稿者癒耶
> 花ちゃんさん返信ありがとうございます。
> .FlieNameの取得はOKボタンが押されたときのみ、ユーザーが設定したファイル名を保存できるようになっているので、If .ShowDialog() = Windows.Forms.DialogResult.OK Thenを追加して、.FileNameが取得できたときのみ、FileOpenの処理ができるように変更しました。  

正確に.FileNameが取得できた時のみとするなら
さらにファイルの存在を確認する処理が必要です。
If System.IO.File.Exists(.FileName) Then
 〜(略)〜
End if
のような感じで。

しないとは思いますが
ファイル指定したところで、ディレクトリを削除してから
OK押したりするとファイルが存在しなくなったりするので。

[ツリー表示へ]
タイトルRe^4: FileOpenは使用しないほうがいい?
記事No7391
投稿日: 2008/04/22(Tue) 18:14
投稿者魔界の仮面弁士
> 正確に.FileNameが取得できた時のみとするなら
> さらにファイルの存在を確認する処理が必要です。

それは、Try ステートメントでの判定の方が良いと思いますよ。

Exists 判定してから、実際にファイルを読み書きするまでの間に
ファイルの状態が変わる事があるわけですし。

[ツリー表示へ]
タイトルRe^5: FileOpenは使用しないほうがいい?
記事No7460
投稿日: 2008/05/08(Thu) 09:15
投稿者癒耶
> > 正確に.FileNameが取得できた時のみとするなら
> > さらにファイルの存在を確認する処理が必要です。
>
> それは、Try ステートメントでの判定の方が良いと思いますよ。
>
> Exists 判定してから、実際にファイルを読み書きするまでの間に
> ファイルの状態が変わる事があるわけですし。
Tryステートメントのみでの判定はリソースの消費が多いのでは。
Tryで囲むのは当然ですが
人の手での操作という段階があった直後は
予測可能なエラーの可能性という事で
Existsでの判定を入れておくのはおかしくないかと。
それ以降でファイルの状態が変わった等があった場合には
Catchする、というのが望ましい処理ではないでしょうか。
・・・とは言いつつも私の主観ですので、
もし宜しければ魔界の仮面弁士様の意見を聞かせて頂けると嬉しいです。

[ツリー表示へ]
タイトルRe^6: FileOpenは使用しないほうがいい?
記事No7466
投稿日: 2008/05/08(Thu) 14:17
投稿者魔界の仮面弁士
> Tryステートメントのみでの判定はリソースの消費が多いのでは。
(Catch 時はともかく)Try 自体にはさほどコストがかからなかったような?

で、この手のリソース(資源)消費について考える場合においては、具体的に、
「どのリソースの消費が、どの程度増加するのか」が判断基準になりますね。


> 予測可能なエラーの可能性という事で
> Existsでの判定を入れておくのはおかしくないかと。
しかし、IOException で判定されるのは、Exists だけではありませんよね。

また、保存前の事前確認の点を持ちだしてしまうと、それこそ、書込禁止、
ディスク容量不足、権限不足、ネットワーク切断等々、きりがないような気もします。


> それ以降でファイルの状態が変わった等があった場合には
> Catchする、というのが望ましい処理ではないでしょうか。
Catch するかどうか、また、Catch した後どうするのか、といった点で実装方法に
個人差は出ますが、何にせよ、ファイル制御の際には例外処理がほぼ必須と言えますね。

で、Exists の状態がたびたび変化する可能性が(比較的)高く、しかも、ファイルの
存在有無によって、その後のコードを大きく変えねばならないような状況にあるならば、
例外処理だけでなく、事前判定しておいた方が、動作的にはベターだと思います。

[ツリー表示へ]