DateiVergleicher

Anwendungen, Tools, Userlibs und anderes nützliches.
Benutzeravatar
Franky
Beiträge: 1132
Registriert: 29.08.2004 16:31
Wohnort: Münsterland
Kontaktdaten:

DateiVergleicher

Beitrag von Franky »

Hi Leute, ich hab mir heute einen Dateivergleicher geschrieben, mit dem man 2 Dateien vergleichen kann. (Überflüssige bemerkung, stört mich aber nicht 8) )

Nun, wozu braucht man das ding?
Ich bin gerade bei PGS dabei, neue Dateiformate ein zu binden. Dazu kann man ja bei Wotsit.org viel zu den Dateiformaten finden. Einige Dinge allerdings fehlen da in der Doku, wodurch man sich teilweise echt die Zähne ausbeißen könnte am einbinden des neuen Formats. Mit diesem Programm kann man nun den Dateninhalt zweier Dateien miteinander vergleichen.

Funktionen:
Man kann alle Bytes, Words, Longs sowie ihre Stelle in der Datei anzeigen lassen, die nicht miteinander übereinstimmen.

Zudem vergleicht das Programm die Dateigrößen miteinander.

Der User kann einstellen, ob die Dateien nur bis zu einer Bestimmten Anzahl an Bytes verglichen werden.

Es können eigene HeaderListen zusammen gestellt werden (aus Longs Words und Bytes), die man auch speichern oder laden kann.
Das heißt ich kann dann zum beispiel eine Liste machen
Byte
Long
Word
Byte
Word
Dann liest er erst ein Byte, dann ein Long, dann ein Word, dann ein Byte und dann nochmal ein Word.

Zudem kann man auch in die Datei schreiben, was das austesten erleichtert was Passiert, wenn man diesen oder jenen Parameter des Headers verändert.

Vielleicht kann es ja mal wer gebrauchen, hier der Source

Code: Alles auswählen


Enumeration
   #menu_header_laden
   #menu_header_speichern
   #menu_laden_1
   #menu_laden_2
   #menu_ende
   #menu_hilfe
   #menu_info
EndEnumeration

Enumeration
   #ggt_panel
   #ggt_bytes
   #ggt_words
   #ggt_longs 
   #ggt_daten
   #ggt_header
   #ggt_header_combo
   #ggt_header_info
   #ggt_header_add
   #ggt_header_delete

   #ggt_header_only
   #ggt_header_length
    
   #ggt_compare_intelligent
   #ggt_compare
   
   #ggt_stelle
   #ggt_art
   
   #ggt_wert1
   #ggt_wert2
   
   #ggt_lese
   #ggt_schreibe_1
   #ggt_schreibe_2
   
   #ggt_datei1
   #ggt_datei2

EndEnumeration

Structure Head
           typ.s
           info.s
           tbytes.b
EndStructure

NewList Header.Head()


Global event.l
Global quit.l
Global datei1.s
Global datei2.s



Procedure ReadHeader()
                          UseFile(1)
                          FileSeek(0)
                          UseFile(2)
                          FileSeek(0)
                          x=0
                          ForEach Header()
                                         Select Header()\tbytes
                                                  Case 1
                                                          UseFile(1)
                                                          d1=ReadByte()
                                                          UseFile(2)
                                                          d2=ReadByte() 
                                                  Case 2
                                                          UseFile(1)
                                                          d1=ReadWord()
                                                          UseFile(2)
                                                          d2=ReadWord()
                                                  Case 4
                                                          UseFile(1)
                                                          d1=ReadLong()
                                                          UseFile(2)
                                                          d2=ReadLong()
                                          EndSelect
                                          SetGadgetItemText(#ggt_header,x,Str(d1),2)
                                          SetGadgetItemText(#ggt_header,x,Str(d2),3)
                                          INC x
                          Next 
EndProcedure

Procedure ReadDataFromFile()
If GetGadgetState(#ggt_header_only)=1
        fl=Val(GetGadgetText(#ggt_header_length))
Else        
       fl=FileSize(datei2)
EndIf       
       ClearGadgetItemList(#ggt_bytes)
       ClearGadgetItemList(#ggt_words)
       ClearGadgetItemList(#ggt_longs)
       If ReadFile(1,datei1)
              If ReadFile(2,datei2)
                          a=0
                          While Loc()<fl
                                 UseFile(1)
                                 d1.l=ReadByte()
                                 UseFile(2)
                                 d2.l=ReadByte() 
                                 If d1<>d2
                                        AddGadgetItem(#ggt_bytes,-1,Str(a)+Chr(10)+Str(d1)+Chr(10)+Str(d2))
                                 EndIf
                                 INC a
                                 
                          Wend
                          UseFile(1)
                          FileSeek(0)
                          UseFile(2)
                          FileSeek(0)

                          a=0
                          While Loc()<fl
                                 UseFile(1)
                                 d1.l=ReadWord()
                                 UseFile(2)
                                 d2.l=ReadWord() 
                                 If d1<>d2
                                        AddGadgetItem(#ggt_words,-1,Str(a)+Chr(10)+Str(d1)+Chr(10)+Str(d2))
                                 EndIf
                                 INC a
                                 INC a
                          Wend

                          UseFile(1)
                          FileSeek(0)
                          UseFile(2)
                          FileSeek(0)
                          a=0
                          While Loc()<fl
                                 UseFile(1)
                                 d1.l=ReadLong()
                                 UseFile(2)
                                 d2.l=ReadLong() 
                                 If d1<>d2
                                        AddGadgetItem(#ggt_longs,-1,Str(a)+Chr(10)+Str(d1)+Chr(10)+Str(d2))
                                 EndIf
                                 INC a
                                 INC a
                                 INC a
                                 INC a 
                          Wend
                          ClearGadgetItemList(#ggt_daten)
                          AddGadgetItem(#ggt_daten,-1,"1"+Chr(10)+Str(FileSize(datei1)))
                          AddGadgetItem(#ggt_daten,-1,"2"+Chr(10)+Str(FileSize(datei2)))  
                       ReadHeader()
               CloseFile(2)
          EndIf
          CloseFile(1)
    EndIf
EndProcedure

Procedure ReadDataFromFile_Intelligent()
If GetGadgetState(#ggt_header_only)=1
        fl=Val(GetGadgetText(#ggt_header_length))
Else        
       fl=FileSize(datei2)
EndIf       
       ClearGadgetItemList(#ggt_bytes)
       ClearGadgetItemList(#ggt_words)
       ClearGadgetItemList(#ggt_longs)
       If ReadFile(1,datei1)
              If ReadFile(2,datei2)
                          a=0
                          pos=0
                          Dim werte.l(3)
                          Dim werte2.l(3)
                          While Loc()<fl
                                 UseFile(1)
                                 d1.l=ReadByte()
                                 UseFile(2)
                                 d2.l=ReadByte() 
                                 If d1<>d2
                                        pos=Loc()-1
                                        UseFile(1)
                                        d1.l=ReadByte()
                                        UseFile(2)
                                        d2.l=ReadByte() 
                                        If d1<>d2
                                                UseFile(1)
                                                d1.l=ReadByte()
                                                UseFile(2)
                                                d2.l=ReadByte() 
                                                If d2<>d1
                                                          UseFile(1)
                                                          d1.l=ReadByte()
                                                          UseFile(2)
                                                          d2.l=ReadByte() 
                                                          If d2<>d1
                                                                    UseFile(1)
                                                                    FileSeek(pos)
                                                                    d1=ReadLong()
                                                                    UseFile(2)
                                                                    FileSeek(pos)
                                                                    d2=ReadLong()
                                                                    AddGadgetItem(#ggt_longs,-1,Str(a)+Chr(10)+Str(d1)+Chr(10)+Str(d2))  
                                                                    ADD a,3
                                                          Else
                                                                    UseFile(1)
                                                                    FileSeek(pos)
                                                                    d1=ReadWord()
                                                                    UseFile(2)
                                                                    FileSeek(pos)
                                                                    d2=ReadWord()
                                                                    AddGadgetItem(#ggt_words,-1,Str(a)+Chr(10)+Str(d1)+Chr(10)+Str(d2))   
                                                                    UseFile(1)
                                                                    d1=ReadByte()
                                                                    UseFile(2)
                                                                    d2=ReadByte()
                                                                    AddGadgetItem(#ggt_bytes,-1,Str(a+2)+Chr(10)+Str(d1)+Chr(10)+Str(d2))  
                                                                    ADD a,2
                                                          EndIf
                                                Else 
                                                     UseFile(1)
                                                     FileSeek(pos)
                                                     d1=ReadWord()
                                                     UseFile(2)
                                                     FileSeek(pos)
                                                     d2=ReadWord()
                                                     AddGadgetItem(#ggt_words,-1,Str(a)+Chr(10)+Str(d1)+Chr(10)+Str(d2)) 
                                                     ADD a,1
                                                EndIf
                                        Else
                                                     UseFile(1)
                                                     FileSeek(pos)
                                                     d1=ReadByte()
                                                     UseFile(2)
                                                     FileSeek(pos)
                                                     d2=ReadByte()
                                                  AddGadgetItem(#ggt_bytes,-1,Str(a)+Chr(10)+Str(d1)+Chr(10)+Str(d2)) 
                                        EndIf
                                 EndIf
                                 INC a
                          Wend
                          ClearGadgetItemList(#ggt_daten)
                          AddGadgetItem(#ggt_daten,-1,"1"+Chr(10)+Str(FileSize(datei1)))
                          AddGadgetItem(#ggt_daten,-1,"2"+Chr(10)+Str(FileSize(datei2)))  
                          ReadHeader()
               CloseFile(2)
          EndIf
          CloseFile(1)
    EndIf
EndProcedure


Procedure WriteInFile_1()
              pos=Val(GetGadgetText(#ggt_stelle))
              wert.l=Val(GetGadgetText(#ggt_wert1))
              If OpenFile(1,datei1)
                        FileSeek(pos)
                        Select GetGadgetState(#ggt_art)
                                Case 0
                                       WriteByte(wert)
                                Case 1
                                       WriteWord(wert)
                                Case 2
                                       WriteLong(wert)
                        EndSelect
                        CloseFile(1)
           EndIf
EndProcedure

Procedure WriteInFile_2()
              pos=Val(GetGadgetText(#ggt_stelle))
              wert.l=Val(GetGadgetText(#ggt_wert2))
              If OpenFile(2,datei2)
                        FileSeek(pos)
                        Select GetGadgetState(#ggt_art)
                                Case 0
                                       WriteByte(wert)
                                Case 1
                                       WriteWord(wert)
                                Case 2
                                       WriteLong(wert)
                        EndSelect
                        CloseFile(2)
           EndIf
EndProcedure

Procedure ReadFromFile()
              pos=Val(GetGadgetText(#ggt_stelle))
              If ReadFile(1,datei1)
                     If ReadFile(2,datei2)
                             Select GetGadgetState(#ggt_art)
                                   Case 0
                                          UseFile(1)
                                          FileSeek(pos)
                                          d1=ReadByte()
                                          UseFile(2)
                                          FileSeek(pos)
                                          d2=ReadByte()
                                   Case 1
                                          UseFile(1)
                                          FileSeek(pos)
                                          d1=ReadWord()
                                          UseFile(2)
                                          FileSeek(pos)
                                          d2=ReadWord()
                                   Case 2
                                          UseFile(1)
                                          FileSeek(pos)
                                          d1=ReadLong()
                                          UseFile(2)
                                          FileSeek(pos)
                                          d2=ReadLong()
                            EndSelect
                            SetGadgetText(#ggt_wert1,Str(d1))
                            SetGadgetText(#ggt_wert2,Str(d2)) 
                            CloseFile(2)
                      EndIf
                      CloseFile(1)
            EndIf 
EndProcedure


Procedure UpdateHeaderList()
         ClearGadgetItemList(#ggt_header)
         stelle=0
         bytestelle=0
         ForEach Header()
                   AddGadgetItem(#ggt_header,-1,Str(stelle)+Chr(10)+Str(bytestelle)+Chr(10)+Chr(10)+Chr(10)+Header()\typ+Chr(10)+Header()\info) 
                   INC stelle
                   bytestelle=bytestelle+Header()\tbytes
         Next
         SetGadgetState(#ggt_header,stelle-1)
EndProcedure


Procedure AddHeaderItem()
          SelectElement(Header(),GetGadgetState(#ggt_header)+1)
                  AddElement(Header())
                         Header()\info=GetGadgetText(#ggt_header_info)
                         Header()\typ=GetGadgetText(#ggt_header_combo)
                         Select Header()\typ
                                     Case "Byte"
                                             Header()\tbytes=1 
                                     Case "Word"
                                             Header()\tbytes=2
                                     Case "Long"
                                             Header()\tbytes=4
                       EndSelect
         UpdateHeaderList()               
EndProcedure

Procedure SaveHeader()
        name.s=SaveFileRequester("Speichern der HeaderListe",name,"HeaderDatei|*.hd*",0)
        If name 
              If LCase(GetExtensionPart(name))<>".hd"
                   name=name+".hd" 
              EndIf
              If CreateFile(1,name)
                      ForEach Header()
                                WriteStringN(Header()\typ)
                                WriteStringN(Header()\info)
                                WriteByte(Header()\tbytes)
                     Next 
                     CloseFile(1)
              EndIf
        EndIf                             
EndProcedure

Procedure LoadHeader()
        name.s=OpenFileRequester("Laden der HeaderListe",name,"HeaderDatei|*.hd*",0)
        If name 
              If ReadFile(1,name)
                      ClearList(Header())
                      While Loc()<Lof() 
                               AddElement(Header())
                                Header()\typ=ReadString()
                                Header()\info=ReadString()
                                Header()\tbytes=ReadByte()
                      Wend 
                     CloseFile(1)
                     UpdateHeaderList()
              EndIf
        EndIf                             
EndProcedure



If OpenWindow(1,100,100,600,580,#PB_Window_SystemMenu|#PB_Window_MinimizeGadget,"Dateivergleicher")
                CreateGadgetList(WindowID())
                      PanelGadget(#ggt_panel,0,0,600,350)
                            AddGadgetItem(#ggt_panel,0,"Bytes")
                                    ListIconGadget(#ggt_bytes,10,10,580,280,"Stelle",200,#PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect|#PB_ListIcon_AlwaysShowSelection)
                                    AddGadgetColumn(#ggt_bytes,1,"Datei 1",180)
                                    AddGadgetColumn(#ggt_bytes,2,"Datei 2",180)
                                    
                            AddGadgetItem(#ggt_panel,1,"Words")
                                    ListIconGadget(#ggt_words,10,10,580,280,"Stelle",200,#PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect|#PB_ListIcon_AlwaysShowSelection)
                                    AddGadgetColumn(#ggt_words,1,"Datei 1",180)
                                    AddGadgetColumn(#ggt_words,2,"Datei 2",180)
                                    
                            AddGadgetItem(#ggt_panel,2,"Longs")
                                    ListIconGadget(#ggt_longs,10,10,580,280,"Stelle",200,#PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect|#PB_ListIcon_AlwaysShowSelection)
                                    AddGadgetColumn(#ggt_longs,1,"Datei 1",180)
                                    AddGadgetColumn(#ggt_longs,2,"Datei 2",180)
                            AddGadgetItem(#ggt_panel,3,"Verschiedenes")
                                   ListIconGadget(#ggt_daten,10,10,580,280,"Datei",100 ,#PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect|#PB_ListIcon_AlwaysShowSelection)
                                   AddGadgetColumn(#ggt_daten,1,"Dateigröße",200)
                            AddGadgetItem(#ggt_panel,4,"DateiHeader")
                                   ListIconGadget(#ggt_header,10,10,580,270,"ParamNR",100,#PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect|#PB_ListIcon_AlwaysShowSelection)
                                   AddGadgetColumn(#ggt_header,1,"Stelle",100)
                                   AddGadgetColumn(#ggt_header,2,"Datei1",100)
                                   AddGadgetColumn(#ggt_header,3,"Datei2",100)
                                   AddGadgetColumn(#ggt_header,4,"Typ",100)
                                   AddGadgetColumn(#ggt_header,5,"Info",100)
                                   TextGadget(#PB_Any,10,290,40,20,"Typ:")
                                   ComboBoxGadget(#ggt_header_combo,50,290,100,200)
                                             AddGadgetItem(#ggt_header_combo,0,"Byte")
                                             AddGadgetItem(#ggt_header_combo,1,"Word")
                                             AddGadgetItem(#ggt_header_combo,2,"Long")
                                   TextGadget(#PB_Any,170,290,60,20,"Info:") 
                                   StringGadget(#ggt_header_info,200,290,100,20,"")
                                   ButtonGadget(#ggt_header_add,360,290,100,20,"Hinzufügen")
                                   ButtonGadget(#ggt_header_delete,480,290,100,20,"Löschen")
                                   
                      CloseGadgetList()
                      
                      CheckBoxGadget(#ggt_header_only,10,380,220,20,"Nur Dateiheader auslesen: Länge in Bytes:")
                      StringGadget(#ggt_header_length,230,380,60,20,"0",#PB_String_Numeric|#PB_Text_Right)
                      
                      CheckBoxGadget(#ggt_compare_intelligent,10,420,200,20,"Intelligente Analyse")
                      
                      
                      ButtonGadget(#ggt_compare,10,450,200,30,"Dateien jetzt vergleichen")
                      
                      Frame3DGadget(#PB_Any,300,360,290,120,"Werte Schreiben")
                                 TextGadget(#PB_Any,320,380,60,20,"Datei 1")
                                 StringGadget(#ggt_wert1,310,395,60,20,"")
                                 TextGadget(#PB_Any,390,380,60,20,"Datei 2")
                                 StringGadget(#ggt_wert2,380,395,60,20,"")
                                 ButtonGadget(#ggt_schreibe_1,320,420,60,20,"Schreiben")
                                 ButtonGadget(#ggt_schreibe_2,380,420,60,20,"Schreiben")
                                 
                                 TextGadget(#PB_Any,460,390,60,20,"Art:")
                                 ComboBoxGadget(#ggt_art,520,390,60,200)
                                             AddGadgetItem(#ggt_art,0,"Byte")
                                             AddGadgetItem(#ggt_art,1,"Word")
                                             AddGadgetItem(#ggt_art,2,"Long")

                                 TextGadget(#PB_Any,460,410,60,20,"Stelle:")
                                 StringGadget(#ggt_stelle,520,410,60,20,"")
                                 ButtonGadget(#ggt_lese,480,440,100,20,"Lesen")
                                 
                                 
                      TextGadget(#PB_Any,10,500,80,20,"Datei1:")
                      TextGadget(#PB_Any,10,540,80,20,"Datei1:")
                      TextGadget(#ggt_datei1,90,500,500,40,"")
                      TextGadget(#ggt_datei2,90,540,500,40,"")
                      
                      CreateMenu(1,WindowID())
                         MenuTitle("Datei")
                               MenuItem(#menu_laden_1,"Datei 1")
                               MenuItem(#menu_laden_2,"Datei 2")
                               MenuBar()
                               MenuItem(#menu_ende,"Beenden")
                         MenuTitle("Header")
                               MenuItem(#menu_header_laden,"DateiHeaderliste laden")
                               MenuItem(#menu_header_speichern,"DateiHeaderliste speichern")
                         MenuTitle("Info")
                               MenuItem(#menu_info,"Info")
                     Repeat 
                            event=WaitWindowEvent()
                            If event=#PB_EventGadget
                                     Select EventGadgetID()
                                            Case #ggt_compare
                                                     If GetGadgetState(#ggt_compare_intelligent)=1
                                                         ReadDataFromFile_Intelligent()
                                                     Else
                                                          ReadDataFromFile()
                                                     EndIf
                                            Case #ggt_schreibe_1
                                                      WriteInFile_1()
                                            Case #ggt_schreibe_2
                                                      WriteInFile_2()
                                            Case #ggt_lese
                                                      ReadFromFile()
                                            Case #ggt_header_add 
                                                        AddHeaderItem()
                                            Case #ggt_header_delete
                                                        SelectElement(Header(),GetGadgetState(#ggt_header))
                                                        DeleteElement(Header())
                                                        UpdateHeaderList()
                                     EndSelect
                            ElseIf event=#PB_EventMenu
                                     Select EventMenuID()
                                                Case #menu_laden_1
                                                    dn.s=OpenFileRequester("Datei 1 wählen",GetPathPart(datei1),"All|*.*",0)
                                                    If dn
                                                          datei1=dn
                                                          SetGadgetText(#ggt_datei1,datei1) 
                                                    EndIf
                                                Case #menu_laden_2
                                                    dn.s=OpenFileRequester("Datei 2 wählen",GetPathPart(datei2),"All|*.*",0)
                                                    If dn
                                                          datei2=dn
                                                          SetGadgetText(#ggt_datei2,datei2)
                                                    EndIf 
                                              Case #menu_ende
                                                      quit=1
                                              Case #menu_header_laden
                                                        LoadHeader()
                                              Case #menu_header_speichern
                                                        SaveHeader()
                                              Case #menu_info 
                                                        MessageRequester("Info","Dateivergleicher wurde geschrieben von Franky")
                                     EndSelect
                            ElseIf event=#PB_EventCloseWindow
                                      quit=1
                            EndIf
                     Until quit=1
                     CloseWindow(1)
EndIf                     
Ich weiß, der Code is net sehr optimiert (Thema Rekursion beim intelligenten analysieren ;)) aber ich hatte einfach keine Lust.
:oops: Es reicht mir so und sooo oft braucht man´s ja doch nicht und dann kann man ja ruhig mal ne sekunde Warten, bis die daten gelesen wurden ;)[/code]
Zuletzt geändert von Franky am 08.05.2014 19:00, insgesamt 1-mal geändert.
Falsch zugeordnetes Zitat des Tages: "O'zapft is" - Edward Snowden :)
Benutzeravatar
Lebostein
Beiträge: 674
Registriert: 13.09.2004 11:31
Wohnort: Erzgebirge

Beitrag von Lebostein »

Es ist eine etwas eigenartige Vorgehensweise, jedes Byte einzeln aus den Dateien herauszulesen (sehr langsam). Warum lädst du nicht einfach jede der Dateien mit einem Rutsch (ReadData) in einen Speicherbereich und vergleichst die Speicherbereiche mit den Peek-Befehlen oder einfach mit entsprechenden Zeigern? So kannst du deinen Code wahnsinnig beschleunigen. Außerdem wird es übersichtlicher, du kannst dir den ganzen UseFile()-Kram sparen und der Quellcode ist dann vielleicht nur ein viertel so lang wie jetzt...

Code: Alles auswählen

FileName1$ = ""
FileName2$ = ""

FileNumber1 = ReadFile(#PB_Any, FileName1$)
FileLength1 = Lof()
FileAdress1 = AllocateMemory(FileLength1)
ReadData(FileAdress1, FileLength1)
CloseFile(FileNumber1)

FileNumber2 = ReadFile(#PB_Any, FileName2$)
FileLength2 = Lof()
FileAdress2 = AllocateMemory(FileLength2)
ReadData(FileAdress2, FileLength2)
CloseFile(FileNumber2)

; Hier kommt der Vergleich
; Nun brauchen keine Dateien mehr geöffnet oder geschlossen werden
; Auch werden keine Leseoperationen mehr ausgeführt, alles ist schon im Speicher
; alles befindet sich jetzt in den Speicherbereichen
; mit der Startadresse 'FileAdress1' und 'FileAdress2'
; Nun kannst su statt den Read-Befehlen einfach die Peek-Befehle verwenden z.B.:

; bisher:  OpenFile(1): UseFile(1): FileSeek(pos): d1 = ReadByte(): CloseFile(1)
; jetzt:   d1 = PeekB(FileAdress1 + pos)

FreeMemory(FileAdress1)
FreeMemory(FileAdress2)
Benutzeravatar
Franky
Beiträge: 1132
Registriert: 29.08.2004 16:31
Wohnort: Münsterland
Kontaktdaten:

Beitrag von Franky »

Hm, jo, ich sach ja, optimiert ist er net.

Es war nur ne kleine Bastelei zwischendurch ;)
Falsch zugeordnetes Zitat des Tages: "O'zapft is" - Edward Snowden :)
Antworten