Access

Usar VBA para identificar tipos de archivos

Entonces, esta es una necesidad de nicho, pero recientemente fui parte de una discusión en la que un usuario quería recuperar algunos archivos que insistía que eran xlsx, pero se informó que Excel no era válido.

Proporcionó un archivo de muestra y estaba en lo cierto: Excel no lo abrió. Comencé a investigar y decidí examinar el archivo con más detalle y descubrí que NO era un archivo xlsx, independientemente de la extensión, de hecho era un archivo de video mp4.

Ahora, hice lo anterior manualmente y pensé si VBA podría hacer dicho análisis automáticamente.

Alerta de spoiler, la respuesta es sí. Sigue leyendo.

El concepto básico: firmas de archivos

La idea básica es que «la mayoría» de los archivos contienen una sección de «encabezado» (normalmente al comienzo del archivo) que incluye varios bits de información y normalmente incluye un identificador único que permite identificar el tipo de archivo.

Así que no se trata simplemente de mirar la extensión del archivo. Eso podría ser incorrecto. En lugar de ello, leemos parte del contenido real del archivo, el encabezado, y lo utilizamos para determinar correctamente el tipo de archivo.

El código

Entonces comencé a incursionar con VBA para leer esta sección de ‘encabezado’ y desglosar las distintas firmas de archivos.

A continuación se muestra mi primera prueba (probablemente el 80-85% del camino). Todavía quiero perfeccionar la identificación del documento de Office (sé que se puede hacer, sólo necesito tener tiempo para hacerlo), pero lo publicaré «tal cual» con la esperanza de que pueda ser útil para alguien más. Todavía es difícil, necesita un manejo adecuado de errores…, pero funciona.

Funciones auxiliares

Como es habitual, tengo un par de funciones auxiliares:

'Helper function to read a file's signature
Function GetFilesSignature(filePath As String) As String
    Dim fileNum               As Integer
    Dim sSignature            As String

    fileNum = FreeFile
    Open filePath For Binary Access Read As fileNum
    'sSignature = Space$(16)
    sSignature = Space$(500) 'increased significantly for files like .tar
    Get fileNum, 1, sSignature
    Close fileNum

    GetFilesSignature = sSignature
End Function

' Helper function to convert binary string to hex for debugging
Function ConvertToHex(binaryStr As String) As String
    Dim i                     As Integer
    Dim hexStr                As String
    For i = 1 To Len(binaryStr)
        hexStr = hexStr & " " & Right("0" & Hex(Asc(Mid(binaryStr, i, 1))), 2)
    Next i
    ConvertToHex = Trim(hexStr)
End Function

Procedimientos principales

'Main function!
Function IdentifyFileType(ByVal filePath As String, _
                          ByRef sFileType As String, _
                          ByRef sFileExtension As String, _
                          ByRef sSignature As String, _
                          ByRef sHEXsSignature As String) As Boolean
    Static vTestArray         As Variant
    Dim sTestHEXSignature     As String
    Dim sTestSignature        As String
    Dim lArrayRow             As Long
    Dim sOutput               As String
    Dim sTestSignatureStart   As String
    Dim sTestSignatureEnd     As String
    Dim lTestSignatureEndOffset As Long

    sSignature = GetFilesSignature(filePath)
    sHEXsSignature = ConvertToHex(sSignature)
    'Debug.Print "File sSignature: '" & sSignature & "'", , sHEXsSignature

    If IsEmpty(vTestArray) Then vTestArray = BuildTestArray 'Small performance boost
    'vTestArray = BuildTestArray '*** For Development purposes
    For lArrayRow = LBound(vTestArray, 1) To UBound(vTestArray, 1)
        sTestSignature = vTestArray(lArrayRow, 0)
        sTestHEXSignature = ConvertToHex(Mid(sSignature, vTestArray(lArrayRow, 3) + 1, UBound(Split(sTestSignature)) + 1))
        If InStr(sTestSignature, "?") = 0 Then    'Most cases
            'If Left(sHEXsSignature, Len(vTestArray(lArrayRow, 0))) = vTestArray(lArrayRow, 0) Then
            If sTestHEXSignature = vTestArray(lArrayRow, 0) Then
                sFileType = vTestArray(lArrayRow, 1)
                sFileExtension = vTestArray(lArrayRow, 2)
                Exit For
            End If
        Else    'Exceptions like webp, jpg, wav, avi, ... with patterns rather than a single signature
            sTestSignatureStart = Left(sTestSignature, InStr(sTestSignature, "?") - 2)
            sTestSignatureEnd = Mid(sTestSignature, InStrRev(sTestSignature, "?") + 2)
            'sTestSignatureEndOffset = UBound(Split(Trim(Replace(Replace(sTestSignature, sTestSignatureStart, ""), sTestSignatureEnd, "")), " ")) + 1
            lTestSignatureEndOffset = Len(Replace(Replace(sTestSignature, sTestSignatureStart, ""), sTestSignatureEnd, ""))
            If Left(sTestHEXSignature, Len(sTestSignatureStart)) = sTestSignatureStart And Mid(sTestHEXSignature, Len(sTestSignatureStart) + lTestSignatureEndOffset + 1, Len(sTestSignatureEnd)) = sTestSignatureEnd Then
                sFileType = vTestArray(lArrayRow, 1)
                sFileExtension = vTestArray(lArrayRow, 2)
                Exit For
            End If
        End If
    Next lArrayRow

End Function

'Function to build an array of file signatures, this can further be expanded as I've just included 64 file types to date
'I used an array, but you could use a table, worksheet, ...
Function BuildTestArray() As Variant
    Dim vFileSignatures(63, 3) As String    ' 9->rows, 2->columns
    Dim lCounter              As Long

    vFileSignatures(lCounter, 0) = "00 01 00 00 53 74 61 6E 64 61 72 64 20 4A 65 74 20 44 42"
    vFileSignatures(lCounter, 1) = "Microsoft Access Database"
    vFileSignatures(lCounter, 2) = "mdb"
    vFileSignatures(lCounter, 3) = 0

    lCounter = lCounter + 1
    vFileSignatures(lCounter, 0) = "00 01 00 00 53 74 61 6E 64 61 72 64 20 41 43 45 20 44 42"
    vFileSignatures(lCounter, 1) = "Microsoft Access 2007+ Database"
    vFileSignatures(lCounter, 2) = "accdb"
    vFileSignatures(lCounter, 3) = 0

    lCounter = lCounter + 1
    vFileSignatures(lCounter, 0) = "00 01 00 00 4D 53 49 53 41 4D 20 44 61 74 61 62 61 73 65"
    vFileSignatures(lCounter, 1) = "Microsoft Money file"
    vFileSignatures(lCounter, 2) = "mny"
    vFileSignatures(lCounter, 3) = 0

    lCounter = lCounter + 1
    vFileSignatures(lCounter, 0) = "53 51 4C 69 74 65 20 66 6F 72 6D 61 74 20 33 00"
    vFileSignatures(lCounter, 1) = "SQLite Database"
    vFileSignatures(lCounter, 2) = "sqlitedb, sqlite, db"
    vFileSignatures(lCounter, 3) = 0

    lCounter = lCounter + 1
    vFileSignatures(lCounter, 0) = "D0 CF 11 E0 A1 B1 1A E1"
    vFileSignatures(lCounter, 1) = "Compound File Binary Format, a container format defined by Microsoft COM"
    vFileSignatures(lCounter, 2) = "doc, xls, ppt, msi, msg"
    vFileSignatures(lCounter, 3) = 0

    lCounter = lCounter + 1
    vFileSignatures(lCounter, 0) = "25 50 44 46 2D"
    vFileSignatures(lCounter, 1) = "PDF document"
    vFileSignatures(lCounter, 2) = "pdf"
    vFileSignatures(lCounter, 3) = 0

    lCounter = lCounter + 1
    vFileSignatures(lCounter, 0) = "7B 5C 72 74 66 31"
    vFileSignatures(lCounter, 1) = "Rich Text Format"
    vFileSignatures(lCounter, 2) = "rtf"
    vFileSignatures(lCounter, 3) = 0

    lCounter = lCounter + 1
    vFileSignatures(lCounter, 0) = "52 65 63 65 69 76 65 64 3A"
    vFileSignatures(lCounter, 1) = "Email Message var5"
    vFileSignatures(lCounter, 2) = "eml"
    vFileSignatures(lCounter, 3) = 0

    lCounter = lCounter + 1
    vFileSignatures(lCounter, 0) = "21 42 44 4E"
    vFileSignatures(lCounter, 1) = "Microsoft Outlook Personal Storage Table file"
    vFileSignatures(lCounter, 2) = "pst"
    vFileSignatures(lCounter, 3) = 0

    lCounter = lCounter + 1
    vFileSignatures(lCounter, 0) = "25 21 50 53 2D 41 64 6F 62 65 2D 33 2E 30 20 45 50 53 46 2D 33 2E 30"
    vFileSignatures(lCounter, 1) = "Encapsulated PostScript file version 3.0"
    vFileSignatures(lCounter, 2) = "eps, epsf"
    vFileSignatures(lCounter, 3) = 0
    lCounter = lCounter + 1
    vFileSignatures(lCounter, 0) = "25 21 50 53 2D 41 64 6F 62 65 2D 33 2E 31 20 45 50 53 46 2D 33 2E 30"
    vFileSignatures(lCounter, 1) = "Encapsulated PostScript file version 3.1"
    vFileSignatures(lCounter, 2) = "eps, epsf"
    vFileSignatures(lCounter, 3) = 0

    lCounter = lCounter + 1
    vFileSignatures(lCounter, 0) = "49 54 53 46 03 00 00 00 60 00 00 00"
    vFileSignatures(lCounter, 1) = "MS Windows HtmlHelp Data"
    vFileSignatures(lCounter, 2) = "chm"
    vFileSignatures(lCounter, 3) = 0

    lCounter = lCounter + 1
    vFileSignatures(lCounter, 0) = "3F 5F"
    vFileSignatures(lCounter, 1) = "Windows 3.x/95/98 Help file"
    vFileSignatures(lCounter, 2) = "hlp"
    vFileSignatures(lCounter, 3) = 0

    lCounter = lCounter + 1
    vFileSignatures(lCounter, 0) = "25 21 50 53"
    vFileSignatures(lCounter, 1) = "PostScript document"
    vFileSignatures(lCounter, 2) = "ps"
    vFileSignatures(lCounter, 3) = 0


    ' Images
    ' //////////////////////////////////////////////////////////////////////////////
    lCounter = lCounter + 1
    vFileSignatures(lCounter, 0) = "42 4D"
    vFileSignatures(lCounter, 1) = "BMP file, a bitmap format used mostly in the Windows world"
    vFileSignatures(lCounter, 2) = "bmp, dib"
    vFileSignatures(lCounter, 3) = 0

    lCounter = lCounter + 1
    vFileSignatures(lCounter, 0) = "47 49 46 38 37 61"
    vFileSignatures(lCounter, 1) = "Image file encoded in the Graphics Interchange Format (GIF87a)"
    vFileSignatures(lCounter, 2) = "gif"
    vFileSignatures(lCounter, 3) = 0
    lCounter = lCounter + 1
    vFileSignatures(lCounter, 0) = "47 49 46 38 39 61"
    vFileSignatures(lCounter, 1) = "Image file encoded in the Graphics Interchange Format (GIF89a)"
    vFileSignatures(lCounter, 2) = "gif"
    vFileSignatures(lCounter, 3) = 0

    lCounter = lCounter + 1
    vFileSignatures(lCounter, 0) = "66 74 79 70 68 65 69 63"
    vFileSignatures(lCounter, 1) = "High Efficiency Image Container (HEIC)"
    vFileSignatures(lCounter, 2) = "heic"
    vFileSignatures(lCounter, 3) = 4

    lCounter = lCounter + 1
    vFileSignatures(lCounter, 0) = "00 00 01 00"
    vFileSignatures(lCounter, 1) = "Computer icon encoded in ICO file format"
    vFileSignatures(lCounter, 2) = "ico"
    vFileSignatures(lCounter, 3) = 0

    lCounter = lCounter + 1
    vFileSignatures(lCounter, 0) = "FF D8 FF DB"
    vFileSignatures(lCounter, 1) = "JPEG raw or in the JFIF or Exif file format"
    vFileSignatures(lCounter, 2) = "jpg"
    vFileSignatures(lCounter, 3) = 0
    lCounter = lCounter + 1
    vFileSignatures(lCounter, 0) = "FF D8 FF E0 00 10 4A 46 49 46 00 01"
    vFileSignatures(lCounter, 1) = "JPEG raw or in the JFIF or Exif file format"
    vFileSignatures(lCounter, 2) = "jpg"
    vFileSignatures(lCounter, 3) = 0
    lCounter = lCounter + 1
    vFileSignatures(lCounter, 0) = "FF D8 FF EE"
    vFileSignatures(lCounter, 1) = "JPEG raw or in the JFIF or Exif file format"
    vFileSignatures(lCounter, 2) = "jpg"
    vFileSignatures(lCounter, 3) = 0
    lCounter = lCounter + 1
    vFileSignatures(lCounter, 0) = "FF D8 FF E1 ?? ?? 45 78 69 66 00 00"
    vFileSignatures(lCounter, 1) = "JPEG raw or in the JFIF or Exif file format"
    vFileSignatures(lCounter, 2) = "jpg"
    vFileSignatures(lCounter, 3) = 0
    lCounter = lCounter + 1
    vFileSignatures(lCounter, 0) = "FF D8 FF E0"
    vFileSignatures(lCounter, 1) = "JPEG raw or in the JFIF or Exif file format"
    vFileSignatures(lCounter, 2) = "jpg"
    vFileSignatures(lCounter, 3) = 0

    lCounter = lCounter + 1
    vFileSignatures(lCounter, 0) = "00 00 00 0C 6A 50 20 20 0D 0A 87 0A"
    vFileSignatures(lCounter, 1) = "JPEG 2000 format"
    vFileSignatures(lCounter, 2) = "jp2, j2k, jpf, jpm, jpg2, j2c, jpc, jpx, mj2"
    vFileSignatures(lCounter, 3) = 0

    lCounter = lCounter + 1
    vFileSignatures(lCounter, 0) = "4F 67 67 53"
    vFileSignatures(lCounter, 1) = "Ogg, an open source media container format"
    vFileSignatures(lCounter, 2) = "ogg, oga, ogv"
    vFileSignatures(lCounter, 3) = 0

    lCounter = lCounter + 1
    vFileSignatures(lCounter, 0) = "89 50 4E 47 0D 0A 1A 0A"
    vFileSignatures(lCounter, 1) = "Image encoded in the Portable Network Graphics format"
    vFileSignatures(lCounter, 2) = "png"
    vFileSignatures(lCounter, 3) = 0

    lCounter = lCounter + 1
    vFileSignatures(lCounter, 0) = "38 42 50 53"
    vFileSignatures(lCounter, 1) = "Photoshop Document file, Adobe Photoshop's native file format"
    vFileSignatures(lCounter, 2) = "psd"
    vFileSignatures(lCounter, 3) = 0

    lCounter = lCounter + 1
    vFileSignatures(lCounter, 0) = "49 49 2A 00"
    vFileSignatures(lCounter, 1) = "Tagged Image File Format (TIFF - little-endian)"
    vFileSignatures(lCounter, 2) = "tif, tiff"
    vFileSignatures(lCounter, 3) = 0
    lCounter = lCounter + 1
    vFileSignatures(lCounter, 0) = "4D 4D 00 2A"
    vFileSignatures(lCounter, 1) = "Tagged Image File Format (TIFF - big-endian)"
    vFileSignatures(lCounter, 2) = "tif, tiff"
    vFileSignatures(lCounter, 3) = 0
    lCounter = lCounter + 1
    vFileSignatures(lCounter, 0) = "49 49 2B 00"
    vFileSignatures(lCounter, 1) = "BigTIFF (little-endian)"
    vFileSignatures(lCounter, 2) = "tif, tiff"
    vFileSignatures(lCounter, 3) = 0
    lCounter = lCounter + 1
    vFileSignatures(lCounter, 0) = "4D 4D 00 2B"
    vFileSignatures(lCounter, 1) = "BigTIFF (big-endian)"
    vFileSignatures(lCounter, 2) = "tif, tiff"
    vFileSignatures(lCounter, 3) = 0

    lCounter = lCounter + 1
    vFileSignatures(lCounter, 0) = "52 49 46 46 ?? ?? ?? ?? 57 45 42 50"
    vFileSignatures(lCounter, 1) = "Google WebP image file"
    vFileSignatures(lCounter, 2) = "webp"
    vFileSignatures(lCounter, 3) = 0


    ' Audio
    ' //////////////////////////////////////////////////////////////////////////////
    lCounter = lCounter + 1
    vFileSignatures(lCounter, 0) = "66 4C 61 43"
    vFileSignatures(lCounter, 1) = "Free Lossless Audio Codec"
    vFileSignatures(lCounter, 2) = "flac"
    vFileSignatures(lCounter, 3) = 0

    lCounter = lCounter + 1
    vFileSignatures(lCounter, 0) = "4D 54 68 64"
    vFileSignatures(lCounter, 1) = "MIDI sound file"
    vFileSignatures(lCounter, 2) = "mid, midi"
    vFileSignatures(lCounter, 3) = 0

    lCounter = lCounter + 1
    vFileSignatures(lCounter, 0) = "FF FB"
    vFileSignatures(lCounter, 1) = "MPEG-1 Layer 3 file without an ID3 tag or with an ID3v1 tag (which is appended at the end of the file)"
    vFileSignatures(lCounter, 2) = "mp3"
    vFileSignatures(lCounter, 3) = 0
    lCounter = lCounter + 1
    vFileSignatures(lCounter, 0) = "FF F3"
    vFileSignatures(lCounter, 1) = "MPEG-1 Layer 3 file without an ID3 tag or with an ID3v1 tag (which is appended at the end of the file)"
    vFileSignatures(lCounter, 2) = "mp3"
    vFileSignatures(lCounter, 3) = 0
    lCounter = lCounter + 1
    vFileSignatures(lCounter, 0) = "FF F2"
    vFileSignatures(lCounter, 1) = "MPEG-1 Layer 3 file without an ID3 tag or with an ID3v1 tag (which is appended at the end of the file)"
    vFileSignatures(lCounter, 2) = "mp3"
    vFileSignatures(lCounter, 3) = 0
    lCounter = lCounter + 1
    vFileSignatures(lCounter, 0) = "49 44 33"
    vFileSignatures(lCounter, 1) = "MP3 file with an ID3v2 container "
    vFileSignatures(lCounter, 2) = "mp3"
    vFileSignatures(lCounter, 3) = 0

    lCounter = lCounter + 1
    vFileSignatures(lCounter, 0) = "52 49 46 46 ?? ?? ?? ?? 57 41 56 45"
    vFileSignatures(lCounter, 1) = "Waveform Audio File Format"
    vFileSignatures(lCounter, 2) = "wav"
    vFileSignatures(lCounter, 3) = 0



    ' Video
    ' //////////////////////////////////////////////////////////////////////////////
    lCounter = lCounter + 1
    vFileSignatures(lCounter, 0) = "52 49 46 46 ?? ?? ?? ?? 41 56 49 20"
    vFileSignatures(lCounter, 1) = "Audio Video Interleave video format"
    vFileSignatures(lCounter, 2) = "avi"
    vFileSignatures(lCounter, 3) = 0

    lCounter = lCounter + 1
    vFileSignatures(lCounter, 0) = "46 4C 56"
    vFileSignatures(lCounter, 1) = "Flash Video file"
    vFileSignatures(lCounter, 2) = "flv"
    vFileSignatures(lCounter, 3) = 0

    lCounter = lCounter + 1
    vFileSignatures(lCounter, 0) = "66 74 79 70 69 73 6F 6D"
    vFileSignatures(lCounter, 1) = "ISO Base Media file (MPEG-4)"
    vFileSignatures(lCounter, 2) = "mp4"
    vFileSignatures(lCounter, 3) = 4
    lCounter = lCounter + 1
    vFileSignatures(lCounter, 0) = "66 74 79 70 4D 53 4E 56"
    vFileSignatures(lCounter, 1) = "MPEG-4 video file"
    vFileSignatures(lCounter, 2) = "mp4"
    vFileSignatures(lCounter, 3) = 4
    lCounter = lCounter + 1    'generic entry until I figure out other isom values
    vFileSignatures(lCounter, 0) = "66 74 79 70"
    vFileSignatures(lCounter, 1) = "MPEG-4 video file"
    vFileSignatures(lCounter, 2) = "mp4"
    vFileSignatures(lCounter, 3) = 4


    ' Archives
    ' //////////////////////////////////////////////////////////////////////////////
    lCounter = lCounter + 1
    vFileSignatures(lCounter, 0) = "37 7A BC AF 27 1C"
    vFileSignatures(lCounter, 1) = "7-Zip File Format"
    vFileSignatures(lCounter, 2) = "7z"
    vFileSignatures(lCounter, 3) = 0

    lCounter = lCounter + 1
    vFileSignatures(lCounter, 0) = "42 5A 68"
    vFileSignatures(lCounter, 1) = "Compressed file using Bzip2 algorithm"
    vFileSignatures(lCounter, 2) = "gbz2"
    vFileSignatures(lCounter, 3) = 0

    lCounter = lCounter + 1
    vFileSignatures(lCounter, 0) = "1F 8B"
    vFileSignatures(lCounter, 1) = "GZIP compressed file"
    vFileSignatures(lCounter, 2) = "gz, tar.gz"
    vFileSignatures(lCounter, 3) = 0

    lCounter = lCounter + 1
    vFileSignatures(lCounter, 0) = "4C 5A 49 50"
    vFileSignatures(lCounter, 1) = "lzip compressed file"
    vFileSignatures(lCounter, 2) = "lz"
    vFileSignatures(lCounter, 3) = 0

    lCounter = lCounter + 1
    vFileSignatures(lCounter, 0) = "52 61 72 21 1A 07 00"
    vFileSignatures(lCounter, 1) = "Roshal ARchive compressed archive v1.50 onwards"
    vFileSignatures(lCounter, 2) = "rar"
    vFileSignatures(lCounter, 3) = 0
    lCounter = lCounter + 1
    vFileSignatures(lCounter, 0) = "52 61 72 21 1A 07 01 00"
    vFileSignatures(lCounter, 1) = "Roshal ARchive compressed archive v5.00 onwards"
    vFileSignatures(lCounter, 2) = "rar"
    vFileSignatures(lCounter, 3) = 0

    lCounter = lCounter + 1
    vFileSignatures(lCounter, 0) = "75 73 74 61 72 00 30 30"
    vFileSignatures(lCounter, 1) = "tar archive"
    vFileSignatures(lCounter, 2) = "tar"
    vFileSignatures(lCounter, 3) = 257
    lCounter = lCounter + 1
    vFileSignatures(lCounter, 0) = "75 73 74 61 72 20 20 00"
    vFileSignatures(lCounter, 1) = "tar archive"
    vFileSignatures(lCounter, 2) = "tar"
    vFileSignatures(lCounter, 3) = 257

    lCounter = lCounter + 1
    vFileSignatures(lCounter, 0) = "50 4B 03 04"
    vFileSignatures(lCounter, 1) = "zip file format and formats based on it, such as EPUB, JAR, ODF, OOXML"
    vFileSignatures(lCounter, 2) = "zip"
    vFileSignatures(lCounter, 3) = 0
    lCounter = lCounter + 1
    vFileSignatures(lCounter, 0) = "50 4B 05 06"
    vFileSignatures(lCounter, 1) = "zip file format and formats based on it, such as EPUB, JAR, ODF, OOXML (empty archive)"
    vFileSignatures(lCounter, 2) = "zip"
    vFileSignatures(lCounter, 3) = 0
    lCounter = lCounter + 1
    vFileSignatures(lCounter, 0) = "50 4B 07 08"
    vFileSignatures(lCounter, 1) = "zip file format and formats based on it, such as EPUB, JAR, ODF, OOXML (spanned archive)"
    vFileSignatures(lCounter, 2) = "zip"
    vFileSignatures(lCounter, 3) = 0




    lCounter = lCounter + 1
    vFileSignatures(lCounter, 0) = "4D 53 43 46"
    vFileSignatures(lCounter, 1) = "Microsoft Cabinet file"
    vFileSignatures(lCounter, 2) = "cab"
    vFileSignatures(lCounter, 3) = 0

    lCounter = lCounter + 1
    vFileSignatures(lCounter, 0) = "49 53 63 28"
    vFileSignatures(lCounter, 1) = "InstallShield CAB Archive File"
    vFileSignatures(lCounter, 2) = "cab"
    vFileSignatures(lCounter, 3) = 0

    lCounter = lCounter + 1
    vFileSignatures(lCounter, 0) = "3C 3C 3C 20 4F 72 61 63 6C 65 20 56 4D 20 56 69 72 74 75 61 6C 42 6F 78 20 44 69 73 6B 20 49 6D 61 67 65 20 3E 3E 3E"
    vFileSignatures(lCounter, 1) = "VirtualBox Virtual Hard Disk file format"
    vFileSignatures(lCounter, 2) = "vdi"
    vFileSignatures(lCounter, 3) = 0

    lCounter = lCounter + 1
    vFileSignatures(lCounter, 0) = "63 6F 6E 65 63 74 69 78"
    vFileSignatures(lCounter, 1) = "Windows Virtual PC Virtual Hard Disk file format"
    vFileSignatures(lCounter, 2) = "vhd"
    vFileSignatures(lCounter, 3) = 0

    lCounter = lCounter + 1
    vFileSignatures(lCounter, 0) = "4B 44 4D"
    vFileSignatures(lCounter, 1) = "VMDK files"
    vFileSignatures(lCounter, 2) = "vmdk"
    vFileSignatures(lCounter, 3) = 0
    lCounter = lCounter + 1
    vFileSignatures(lCounter, 0) = "23 20 44 69 73 6B 20 44 65 73 63 72 69 70 74 6F"
    vFileSignatures(lCounter, 1) = "VMware 4 Virtual Disk description file (split disk)"
    vFileSignatures(lCounter, 2) = "vmdk"
    vFileSignatures(lCounter, 3) = 0

    lCounter = lCounter + 1
    vFileSignatures(lCounter, 0) = "00 01 00 00 00"
    vFileSignatures(lCounter, 1) = "TrueType font"
    vFileSignatures(lCounter, 2) = "ttf, tte, dfont"
    vFileSignatures(lCounter, 3) = 0

    lCounter = lCounter + 1
    vFileSignatures(lCounter, 0) = "4F 54 54 4F"
    vFileSignatures(lCounter, 1) = "OpenType font"
    vFileSignatures(lCounter, 2) = "otf"
    vFileSignatures(lCounter, 3) = 0

    BuildTestArray = vFileSignatures
End Function

Ejemplo de uso

A continuación se muestra un ejemplo sencillo de cómo se puede utilizar el código anterior.

Sub Test()
    Dim sFileType             As String
    Dim sFileExtension        As String
    Dim sSignature            As String
    Dim sHEXsSignature        As String
    Const sFile = "C:\temp\img01.jpg"

    Call IdentifyFileType(sFile, sFileType, sFileExtension, sSignature, sHEXsSignature)
    Debug.Print sFile, sFileType, sFileExtension
    Debug.Print
    Debug.Print sSignature
    Debug.Print
    Debug.Print sHEXsSignature
End Sub

Publicaciones relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Mira también
Cerrar
Botón volver arriba