Das Problem ist ja schon bei einfachen Textdateien gegeben...
Ich habe mal ein Versuch anhand der ersten Bytes einer Datei die Extension zu erkennen gebastelt.
Einfach eine oder mehrere Dateien aus dem Explorer auf das ListiconGadget droppen.
Die Extensions die das Progrämmchen erkennt stehen in der Enumeration....
Code: Alles auswählen
; License : Free, unrestricted, no warranty whatsoever - Use at your own risk
; : Copyright (c) 2023 by A.H. (Axolotl)
EnableExplicit
Enumeration EFileExtention
#FileExtention_NONE ; Unknown file extention
#FileExtention_BMP
#FileExtention_JPEG
#FileExtention_PDF
#FileExtention_ZIP
#FileExtention_7z
#FileExtention_WAV
#FileExtention_EXE
EndEnumeration
Structure TExtension
Marker.i
Name$
EnumValue.i
EndStructure
; --- Constants ---------------------------------------------------------------
#MARKER_MASK = $FFFFFFFF
#ExtensionTableMaxEntry = 6 ; set to the number of entries
Global Dim ExtensionTable.TExtension(#ExtensionTableMaxEntry)
; -----------------------------------------------------------------------------
Macro SetExtensionTableEntry(_Name_, _Marker_, _Value_)
ExtensionTable(Index)\Name$ = _Name_
ExtensionTable(Index)\Marker = _Marker_
ExtensionTable(Index)\EnumValue = _Value_
EndMacro
; -----------------------------------------------------------------------------
Procedure InitExtensionTable()
Protected Index
SetExtensionTableEntry("BMP", $E10364D42, #FileExtention_BMP) : Index + 1
SetExtensionTableEntry("JPEG", $464A1000E0FFD8FF, #FileExtention_JPEG) : Index + 1
SetExtensionTableEntry("PDF", $362E312D46445025, #FileExtention_PDF) : Index + 1
SetExtensionTableEntry("ZIP", $2001404034B50, #FileExtention_ZIP) : Index + 1
SetExtensionTableEntry("7z", $2001C27AFBC7A37, #FileExtention_7z) : Index + 1
SetExtensionTableEntry("WAV", $6EE8446464952, #FileExtention_WAV) : Index + 1
SetExtensionTableEntry("EXE", $300905A4D, #FileExtention_EXE) : Index + 1
; ReDim ExtensionTable(Index - 1)
; Debug "INTERNAL INFO: ReDim Table to " + Str(Index - 1)
EndProcedure
InitExtensionTable()
UndefineMacro SetExtensionTableEntry
; -----------------------------------------------------------------------------
Procedure.i CheckOnFile(Gadget, FileName$) ;
Protected FILE, marker, index, count
FILE = ReadFile(#PB_Any, FileName$) ; read with no flags
If FILE
marker = ReadInteger(FILE)
CloseFile(FILE)
EndIf
If marker <> 0 ; found something valid
Debug "Marker == $" + Hex(marker, #PB_Quad) ; <= need this for new identified extentions
AddGadgetItem(Gadget, -1, FileName$ + #LF$ + #LF$ + "$" + Hex(marker, #PB_Quad))
Count = ArraySize(ExtensionTable())
For index = 0 To Count
If (marker & #MARKER_MASK) = (ExtensionTable(index)\Marker & #MARKER_MASK)
SetGadgetItemText(Gadget, CountGadgetItems(Gadget)-1, ExtensionTable(index)\Name$, 1)
ProcedureReturn ExtensionTable(index)\EnumValue
EndIf
Next index
EndIf
ProcedureReturn #FileExtention_NONE
EndProcedure
; -----------------------------------------------------------------------------
Procedure main()
Protected files$, ii, cnt
If OpenWindow(0, 0, 0, 640, 480, "File Extention Detection Example...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
StickyWindow(0, 1)
ListIconGadget(1, 4, 4, 632, 472, "Filename", 432)
AddGadgetColumn(1, 1, "Ext", 64)
AddGadgetColumn(1, 2, "Marker", 128)
EnableGadgetDrop(1, #PB_Drop_Files, #PB_Drag_Copy)
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Break ; say good bye
Case #PB_Event_GadgetDrop
If EventDropType() = #PB_Drop_Files
files$ = EventDropFiles()
If files$
cnt = CountString(files$, #LF$) + 1
For ii = 1 To cnt
CheckOnFile(1, StringField(files$, ii, #LF$))
Next ii
EndIf
EndIf
EndSelect
ForEver
EndIf
ProcedureReturn 0
EndProcedure
End main()