Code-Beispiel
Dateien vergleichen
Lizenz: | Erster Autor: | Letzte Bearbeitung: |
k. A. | hhr | 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
hhr angelegt.
- Die aktuellste Version wurde am 25.06.2020 von
hhr gespeichert.
|
|