VB.NET проверка, открыт ли файл перед продолжением чтения / записи?

есть ли способ проверить, что файл открыт? Единственное, о чем я могу думать, это 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

любые указатели будут оценены! Спасибо!!

3 ответов


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

на самом деле нет смысла использовать функцию "is file in use check", так как вам все равно нужно будет попробовать catch для обработки случая, когда файл не открывается. Файл open может завершиться неудачей по многим причинам, чем он просто уже открыт.

также использование функции для проверки не является гарантией успеха. "Is file in use check" может возвращать false только для файла, открытого для сбоя с уже открытой ошибкой файла, потому что во время между проверкой и попыткой открыть файл ее открыл кто-то другой.


похоже, что два предложения из этой публикация форума MSDN оба включают в себя попытку открыть файл.

первый похож на то, что вы делаете сейчас, а второй включает в себя использование функции Windows API (CreateFile) и проверку на наличие недопустимого дескриптора, означающего, что файл используется. В обоих случаях они полагаются на условие ошибки, чтобы определить, открыт ли файл или нет. Короче говоря, на мой взгляд, метод, который вы используете, является правильным, поскольку не система.ИО.Файл.Собственность IsOpen.