Я пытаюсь разрешить расширение типа файла, прочитав в Visual Basic заголовок файла.У меня проблемы с определением типа файла старых расширений, таких как .pub .vsd .doc .msg .xls ... Я должен прочитать подзаголовок.Я попытался сделать это с помощью byteArray (512), byteArray (513), byteArray (514), byteArray (515) для смещения, как на опубликованном изображении.
, но смотреть самостоятельно
Функция, котораяпрочитайте заголовок:
Private Shared Function ReadHeader(filePath As String) As Int64
Dim byteArr(520) As Byte
Using fsIn = New IO.FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read)
fsIn.Read(byteArr, 0, byteArr.Length)
End Using
Dim result As Int64 = CLng((byteArr(0) * 2 ^ 24) + (byteArr(1) * 2 ^ 16) + (byteArr(2) * 2 ^ 8) + (byteArr(3) * 2 ^ 0))
Return result
End Function
Моя проблема в том, что когда я вычисляю числовые значения в этом случае, я не могу определить тип, потому что мой результат всегда один и тот же.вот так.С новыми расширениями файлов у меня та же проблема, но другое решение, потому что они заархивированы.Мне просто нужно прочитать структуру файла следующим образом:
Enum FileTypesEXT as Int64
New_MicrosoftExtension = 1347093252
'DOCX = 1347093252
'XLSX = 1347093252
'PPTX = 1347093252
'EXCELXM = 1347093252
'EXCELX = 1347093252
'EXCELXB = 1347093252
'WORDX = 1347093252
'WORDXT = 1347093252
OLD_MicrosoftExtension = 3503231456
'MSG = 3503231456
'DOC = 3503231456
'XLS = 3503231456
'VSD = 3503231456
'PUB = 3503231456
'PPT = 3503231456
'WPF = 3503231456
End Enum
Case FileTypesEXT.New_MicrosoftExtension //NewMicrosoftOfficeExt everytime 1347093252
Using z = System.IO.Compression.ZipFile.OpenRead(filePath)
For Each entry In z.Entries
If entry.FullName.StartsWith("word/") Then
NewFileExtension = "docx"
ElseIf entry.FullName.StartsWith("ppt/") Then
NewFileExtension = "pptx"
ElseIf entry.FullName.StartsWith("xl/") Then
NewFileExtension = "xlsx"
Exit For
End If
Next
End Using
...
Теперь я нашел источник, который говорит мне, что я могу читать смещения заголовка, чтобы прочитать подзаголовок
записи подзаголовка
Я пытался прочитать byteArray (512), byteArray (513), byteArray (514), byteArray (515) до byteArr (20).Могу ли я сделать это так или я ошибся с показателями?
If result = 3503231456 Then
Dim checkOffset As Int64 = CLng((byteArr(512) * 2 ^ 24) + (byteArr(513) * 2 ^ 16) + (byteArr(514) * 2 ^ 8) + (byteArr(515) * 2 ^ 0))
If checkOffset = 3970285824 Then
result = 3970285824 'DOC
ElseIf checkOffset1 = 1375760128 Then
result = 1375760128 'MSG
...
Может быть, есть другое решение?Пожалуйста, дайте мне знать :) Я надеюсь, что я объясню мою проблему по этому вопросу, и вы можете работать с этим
РЕДАКТИРОВАТЬ:
Вот мои результаты: (У меня проблемыопределить ".ppt", потому что я получаю много разных значений для файлов, которые ".ppt")