web-dev-qa-db-ja.com

VB.NET読み取り/書き込みを続行する前に、ファイルが開いているかどうかを確認しますか?

ファイルが開いていることを確認する方法はありますか?私が考えることができる唯一のことは、ファイルを開く例外をキャッチできるかどうかを確認するためのTry/Catchですが、ファイルが開いている場合にtrue/falseを返すメソッドを使用できると考えました。

現在、System.IOWalletという名前のクラスで次のコードを使用しています。

    Private holdPath As String = "defaultLog.txt"
    Private _file As New FileStream(holdPath, FileMode.OpenOrCreate, FileAccess.ReadWrite)
    Private file As New StreamWriter(_file)

    Public Function Check(ByVal CheckNumber As Integer, ByVal CheckAmount As Decimal) As Decimal
        Try
            file.WriteLine("testing")
            file.Close()
        Catch e As IOException
          'Note sure if this is the proper way.
        End Try

        Return 0D
    End Function

どんなポインタでも大歓迎です!ありがとうございました!!

9
Dayan
Private Sub IsFileOpen(ByVal file As FileInfo)
    Dim stream As FileStream = Nothing
    Try
        stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None)
        stream.Close()
    Catch ex As Exception

        If TypeOf ex Is IOException AndAlso IsFileLocked(ex) Then
            ' do something here, either close the file if you have a handle, show a msgbox, retry  or as a last resort terminate the process - which could cause corruption and lose data
        End If
    End Try
End Sub

Private Shared Function IsFileLocked(exception As Exception) As Boolean
    Dim errorCode As Integer = Marshal.GetHRForException(exception) And ((1 << 16) - 1)
    Return errorCode = 32 OrElse errorCode = 33
End Function
15
Jeremy Thompson

'is file in use check'関数を使用しても、ファイルを開くことができない場合を処理するには、trycatchが必要になるため実際には意味がありません。ファイルを開くと、すでに開いているだけでなく、さまざまな理由で失敗する可能性があります。

また、関数を使用してチェックを行うことは、成功を保証するものではありません。 'is file in use check'は、ファイルを開いたときにfalseが返される場合があります。これは、チェックしてからファイルを開こうとするまでの間に、他の誰かによって開かれたためです。

6
jussij

これからの2つの提案のように見えます MSDNフォーラムの投稿 どちらもファイルを開こうとすることを含みます。

1つ目は現在行っていることと似ており、2つ目はWindows API関数(CreateFile)を使用して、ファイルが使用中であることを示す無効なハンドルをチェックすることを含みます。どちらの場合も、ファイルが開いているかどうかを判断するためにエラー条件に依存しています。要するに、私の意見では、System.IO.File.IsOpenプロパティがnotあるので、使用している方法は正しいと思います。

2
Mark Hall