Member 11659960 Ответов: 1

Как найти заголовочный файл в VB.NET


моя проблема в том, что я не могу зациклиться, чтобы найти заголовок, потому что результат всегда равен 0
спасибо

Что я уже пробовал:

        Dim headerarray(0 To 3) As Byte
        Dim result, count, pos As Integer
        Dim files As String = FreeFile()
        result = 0

Public Function FindFirstHeader(ByVal filename As String) As String
        Try
            If My.Computer.FileSystem.FileExists(filename) Then
                'OpenFile
                IO.File.Copy(filename, files, False)
                Dim reader As New FileStream(files, FileMode.Open, FileAccess.Read)
                FileOpen(1, files, OpenMode.Input)
                While Not EOF(1)
                    reader.Seek(pos, SeekOrigin.Begin)
                    reader.Read(headerarray, count, 4)
                    If ((headerarray(0) = 255) And ((headerarray(1) = 251) Or (headerarray(1) = 250))) Then
                        result = pos
                    Else
                        pos = pos + 1
                    End If
                End While
                reader.Close()
            Else
                MsgBox("File Error")
            End If
           
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try

        Return result


    End Function

1 Ответов

Рейтинг:
8

Richard Deeming

Ты смешиваешь .Операции с файлами в сетевом стиле (FileStream) с файловыми операциями в стиле VB6 (FileOpen, EOF, FreeFile).

Вы также пытаетесь открыть один и тот же файл дважды. Когда вы звоните FileOpen, вы не указали параметр общего доступа, поэтому он использует значение по умолчанию: LockReadWrite Это, скорее всего, предотвратит открытие файла во второй раз.

Переключитесь на использование .NET file API-это гораздо чище.

Вы также должны включить Option Strict, который предупредит вас об ошибках, таких как объявление, что ваша функция возвращает String когда он на самом деле возвращает Integer.

Что-то вроде этого должно сработать:

Public Function FindFirstHeader(ByVal filename As String) As Integer
    If IO.File.Exists(filename) Then
        Using stream As New FileStream(filename, FileMode.Open, FileAccess.Read)
            Dim headerarray(0 To 3) As Byte
            Dim pos As Integer = 0
            Dim count As Integer = 4
            While count = 4
                reader.Seek(pos, SeekOrigin.Begin)
                count = reader.Read(headerarray, 0, 4)
                If count = 4 AndAlso headerarray(0) = 255 AndAlso (headerarray(1) = 251 OrElse headerarray(1) = 250) Then
                    Return pos
                End If
                
                pos = pos + 1
            End While
        End Using
    End If
    
    Return -1
End Function


Member 11659960

Спасибо Ричарду Димингу за вашу помощь в его работе