9

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

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

    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

任意のポインタをいただければ幸いです!ありがとうございました!!

4

3 に答える 3

17
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

このように呼んでください:

Call IsFileOpen(new FileInfo(filePath))
于 2012-07-02T06:36:49.983 に答える
2

このMSDN フォーラムへの投稿からの 2 つの提案には、どちらもファイルを開こうとする試みが含まれているようです。

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

于 2012-07-02T04:53:40.210 に答える