Buchempfehlung
Mikrocomputertechnik mit Controllern der Atmel AVR-RISC-Familie
Mikrocomputertechnik mit Controllern der Atmel AVR-RISC-Familie
Umfassend, aber leicht verständlich führt dieses Buch in die Programmierung von ATMEL AVR Mikrocontrollern ein. [Mehr Infos...]
FreeBASIC-Chat
Es sind Benutzer im FreeBASIC-Chat online.
(Stand:  )
FreeBASIC bei Twitter
Twitter FreeBASIC-Nachrichten jetzt auch über Twitter erhalten. Follow us!

Code-Beispiel

Code-Beispiele » Dateien und Laufwerke

Dateien vergleichen

Lizenz:Erster Autor:Letzte Bearbeitung:
k. A.Mitgliedhhr 25.06.2020

Wenn man in Windows Dateien vergleichen möchte, kann man fc.exe oder comp.exe verwenden:
fc /b datei1 datei2
fc /b datei1 datei2 | more (pipe more)
comp
comp datei1 datei2

Das folgende Programm ist ein Nachbau:
Pfadname
Pfadname datei1 datei2
Pfadname datei1 datei2 | more
Als Pfad kopieren - Einfügen
Ziehen und Ablegen

Batch-Datei: chcp 1252

Mit Strg+C (Cancel) kann der Programmlauf abgebrochen werden.
Während der Eingabe ist das auch mit der Taste E möglich.

Quellen:
https://www.freebasic.net/forum/viewtopic.php?f=6&t=3558&p=27890&hilit=writeconsole#p27890
https://docs.microsoft.com/de-de/windows-server/administration/windows-commands/fc
https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/more
https://docs.microsoft.com/de-de/windows-server/administration/windows-commands/comp
https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-writefile
https://docs.microsoft.com/en-us/windows/console/writeconsole
https://docs.microsoft.com/de-de/windows/win32/api/winuser/nf-winuser-chartooembuffa
https://docs.microsoft.com/de-de/windows/win32/api/winuser/nf-winuser-oemtocharbuffa

#Include "windows.bi" ' WriteFile, CharToOemBuff, OemToCharBuff

Function Printstring(Byval BytesToWrite As String) As Boolean
   Dim As Handle h = GetStdHandle(STD_OUTPUT_HANDLE)
   Dim As Ulong NumberOfBytesWritten
   BytesToWrite = BytesToWrite & Chr(13,10) ' Zeilenumbruch
   Function = WriteFile(h,Strptr(BytesToWrite),Len(BytesToWrite),@NumberOfBytesWritten,0)
End Function

Function Ascii(Byval text As String) As String
   CharToOemBuff(text,text,Len(text))
   Return text
End Function

#Macro Filecompare
If Len(file1) > 0 Then
   If Instr(file1,":") = 0 Then
      Print Ascii("Es müssen vollständige Pfadangaben gemacht werden.")
      End
   End If
   If Open(file1 For Binary Access Read As #1) <> 0 Then
      Print "Die erste Datei wurde nicht gefunden."
      End
   End If
Else
   Do
      Print "Name der ersten zu vergleichenden Datei: ";
      Input "",file1
      OemToCharBuff(file1,file1,Len(file1)) ' AsciiToAnsi
      If Ucase(file1) = "E" Then
         End
      Elseif Instr(file1,":") = 0 Then
         Print Ascii("Es müssen vollständige Pfadangaben gemacht werden.")
      Elseif Open(file1 For Binary Access Read As #1) <> 0 Then
         Print "Es wurde keine Datei gefunden."
      Else
         Exit Do
      End If
   Loop
End If

If Len(file2) > 0 Then
   If Instr(file2,":") = 0 Then
      Print Ascii("Es müssen vollständige Pfadangaben gemacht werden.")
      End
   End If
   If Open(file2 For Binary Access Read As #2) <> 0 Then
      Print "Die zweite Datei wurde nicht gefunden."
      End
   End If
Else
   Do
      Print "Name der zweiten zu vergleichenden Datei: ";
      Input "",file2
      OemToCharBuff(file2,file2,Len(file2))
      If Ucase(file2) = "E" Then
         End
      Elseif Instr(file2,":") = 0 Then
         Print Ascii("Es müssen vollständige Pfadangaben gemacht werden.")
      Elseif Open(file2 For Binary Access Read As #2) <> 0 Then
         Print "Es wurde keine Datei gefunden."
      Else
         Exit Do
      End If
   Loop
End If

Printstring("Vergleichen der Dateien")
Printstring(Ascii(file1))
Printstring("und")
Printstring(Ascii(file2))

different = False
If Lof(1) < Lof(2) Then
   Print Ascii("Die erste Datei ist kürzer als die zweite Datei.")
   different = True
Elseif Lof(1) > Lof(2) Then
   Print Ascii("Die erste Datei ist länger als die zweite Datei.")
   different = True
Else
   j = 0
   Do Until Eof(1)
      Get #1,,sample1
      Get #2,,sample2
      For i = 0 To c - 1
         If sample1[i] <> sample2[i] Then
            ' Ausgabezeile zusammenstellen:
            s = Hex(i + (j * c))              ' Adresse, Offset
            s = String(8 - Len(s),"0") & s    ' Formatierung
            s1 = Hex(sample1[i])              ' Byte1
            s1 = String(2 - Len(s1),"0") & s1 ' Formatierung
            s2 = Hex(sample2[i])              ' Byte2
            s2 = String(2 - Len(s2),"0") & s2 ' Formatierung
            s = s & ": " & s1 & " " & s2
            Printstring(s) ' Zeile ausgeben - Adresse Byte1 Byte2
            different = True
         End If
      Next i
      j = j + 1
   Loop
End If

Close

If different = False Then
   Printstring("Keine Unterschiede gefunden.")
End If
#EndMacro ' Filecompare

Dim As String file1,file2,sample1,sample2,s,s1,s2
Dim As Ulongint i,j
Dim As Boolean different

Const As Ulong c = 2^17 ' Mit zwei identischen Dateien optimiert
sample1 = Space(c)
sample2 = Space(c)

Dim As String s3

#If True
   file1 = Command(1)
   file2 = Command(2)
   Do
      Filecompare
      Print "Weitere Dateien vergleichen (J/N) ? ";
      Input "",s3
      If Ucase(s3) = "N" Then
         Exit Do
      Else
         printstring("")
         file1 = ""
         file2 = ""
      End If
   Loop
#Else
   file1 = Command(1)
   file2 = Command(2)
   Filecompare
#Endif

End ' filecompare.bas
'

Hier noch ein Beispiel mit Unterprogramm:

#Include "windows.bi" ' WriteFile, CharToOemBuff, OemToCharBuff

Function Printstring(Byval BytesToWrite As String) As Boolean
   Dim As Handle h = GetStdHandle(STD_OUTPUT_HANDLE)
   Dim As Ulong NumberOfBytesWritten
   BytesToWrite = BytesToWrite & Chr(13,10) ' Zeilenumbruch
   Function = WriteFile(h,Strptr(BytesToWrite),Len(BytesToWrite),@NumberOfBytesWritten,0)
End Function

Function Ascii(Byval text As String) As String
   CharToOemBuff(text,text,Len(text))
   Return text
End Function

Dim Shared As String file1,file2,sample1,sample2,s,s1,s2
Dim Shared As Ulongint i,j
Dim Shared As Boolean different

Const As Ulong c = 2^17 ' Mit zwei identischen Dateien optimiert
sample1 = Space(c)
sample2 = Space(c)

Sub Filecompare
   If Len(file1) > 0 Then
      If Instr(file1,":") = 0 Then
         Print Ascii("Es müssen vollständige Pfadangaben gemacht werden.")
         End
      End If
      If Open(file1 For Binary Access Read As #1) <> 0 Then
         Print "Die erste Datei wurde nicht gefunden."
         End
      End If
   Else
      Do
         Print "Name der ersten zu vergleichenden Datei: ";
         Input "",file1
         OemToCharBuff(file1,file1,Len(file1)) ' AsciiToAnsi
         If Ucase(file1) = "E" Then
            End
         Elseif Instr(file1,":") = 0 Then
            Print Ascii("Es müssen vollständige Pfadangaben gemacht werden.")
         Elseif Open(file1 For Binary Access Read As #1) <> 0 Then
            Print "Es wurde keine Datei gefunden."
         Else
            Exit Do
         End If
      Loop
   End If

   If Len(file2) > 0 Then
      If Instr(file2,":") = 0 Then
         Print Ascii("Es müssen vollständige Pfadangaben gemacht werden.")
         End
      End If
      If Open(file2 For Binary Access Read As #2) <> 0 Then
         Print "Die zweite Datei wurde nicht gefunden."
         End
      End If
   Else
      Do
         Print "Name der zweiten zu vergleichenden Datei: ";
         Input "",file2
         OemToCharBuff(file2,file2,Len(file2))
         If Ucase(file2) = "E" Then
            End
         Elseif Instr(file2,":") = 0 Then
            Print Ascii("Es müssen vollständige Pfadangaben gemacht werden.")
         Elseif Open(file2 For Binary Access Read As #2) <> 0 Then
            Print "Es wurde keine Datei gefunden."
         Else
            Exit Do
         End If
      Loop
   End If

   Printstring("Vergleichen der Dateien")
   Printstring(Ascii(file1))
   Printstring("und")
   Printstring(Ascii(file2))

   different = False
   If Lof(1) < Lof(2) Then
      Print Ascii("Die erste Datei ist kürzer als die zweite Datei.")
      different = True
   Elseif Lof(1) > Lof(2) Then
      Print Ascii("Die erste Datei ist länger als die zweite Datei.")
      different = True
   Else
      j = 0
      Do Until Eof(1)
         Get #1,,sample1
         Get #2,,sample2
         For i = 0 To c - 1
            If sample1[i] <> sample2[i] Then
               ' Ausgabezeile zusammenstellen:
               s = Hex(i + (j * c))              ' Adresse, Offset
               s = String(8 - Len(s),"0") & s    ' Formatierung
               s1 = Hex(sample1[i])              ' Byte1
               s1 = String(2 - Len(s1),"0") & s1 ' Formatierung
               s2 = Hex(sample2[i])              ' Byte2
               s2 = String(2 - Len(s2),"0") & s2 ' Formatierung
               s = s & ": " & s1 & " " & s2
               Printstring(s) ' Zeile ausgeben - Adresse Byte1 Byte2
               different = True
            End If
         Next i
         j = j + 1
      Loop
   End If

   Close

   If different = False Then
      Printstring("Keine Unterschiede gefunden.")
   End If
End Sub ' Filecompare

Dim As String s3

#If True
   file1 = Command(1)
   file2 = Command(2)
   Do
      Filecompare
      Print "Weitere Dateien vergleichen (J/N) ? ";
      Input "",s3
      If Ucase(s3) = "N" Then
         Exit Do
      Else
         printstring("")
         file1 = ""
         file2 = ""
      End If
   Loop
#Else
   file1 = Command(1)
   file2 = Command(2)
   Filecompare
#Endif

End ' filecompare.bas
'

Zusätzliche Informationen und Funktionen
  • Das Code-Beispiel wurde am 11.06.2020 von Mitgliedhhr angelegt.
  • Die aktuellste Version wurde am 25.06.2020 von Mitgliedhhr gespeichert.
  Bearbeiten Bearbeiten  

  Versionen Versionen