Newsgroup: it.comp.lang.visual-basic
Titolo: [?] Confronto binario di due files.

Vorrei realizzare un programmino che confronti il contenuto di due files per
verificare se (a parte il nome) hanno lo stesso contenuto.
Visto che il metodo di leggere con
buffer1=Input(1,NumeroFile1)
buffer2=Input(1,NumeroFile2)
e poi confrontare buffer1 e buffer2 non č utilizzabile, come faccio a
leggere i singoli byte e confrontarli?
Grazie.

 leggere i singoli byte e confrontarli?
Se il file può essere contenuto in una stringa, potresti usare
le funzioni lstrcmp e lstrcmpi (Kernel32). La prima è case sensitive,
la seconda no. Eseguono un controllo byte per byte sulle stringhe
passate.
Se non può essere contenuto in una stringa per intero, potresti
confrontare un chuck alla volta.

 confrontare un chuck alla volta.
Cos'è un chuck?
Come si fa a confrontarli?
Ciao.

 Come si fa a confrontarli?
Un chunk è un "pezzo" di qualche cosa.
Prova una cosa di questo tipo:
Dim nFile1 As Long
Dim nFile2 As Long
Dim File1 As String
Dim File2 As String
Dim lpBuff1 As String
Dim lpBuff2 As String
Dim lngRet As Long
   lpBuff1 = String(255, Chr$(0))
   lpBuff2 = lpBuff1
   File1 = NomeFile1
   File2 = NomeFile2
   nFile1 = FreeFile(0)
   Open File1 For Binary Access Read As #nFile1
   nFile2 = FreeFile(0)
   Open File2 For Binary Access Read As #nFile2
   Do While Not EOF(nFile1)
      Get #nFile1, , lpBuff1
      Get #nFile2, , lpBuff2
      lngRet = lstrcmp(lpBuff1, lpBuff2)
      If lngRet Then
         'I file sono diversi
         Exit Do
      End If
      If EOF(nFile2) Then
         Exit Do
      End If
   Loop
   Close #nFile2
   Close #nFile1
Lo stesso paragone in effetti si può fare anche senza usare funzioni
esterne, semplicemente [ If lpBuff1 <> lpBuff2 Then... ] ottenendo
sempre un paragone case sensitive, a meno che non sia stato definito
Option Compare Text.

 Cos'è un chuck?
Un normalissimo refuso ;-)) Penso intendesse un chunk, cioè un blocco di dati.
La funzione che uso io è questa:
______________________________
Function SonoUguali(PrimoFile As String, SecondoFile As String) As Boolean
    If FileLen(PrimoFile) <> FileLen(SecondoFile) Then
        ' se la lunghezza è diversa, inutile continuare
        SonoUguali = False
        Exit Function
    End If
    SonoUguali = True
    Dim Kappa As Long
    Kappa = 4096 ' puoi provare con valori diversi,
    ' ma questo è un buon compromesso
    Dim BloccoDati1 As String * 4096
    Dim BloccoDati2 As String * 4096
    Dim N As Long
    Dim K As Long
    Dim NumBlocchi As Long
    Dim Resto As Long
    Dim FileLibero1 As Integer
    Dim FileLibero2 As Integer
    N = FileLen(PrimoFile)
    NumBlocchi = N \ Kappa
    '    Debug.Print NumBlocchi
    Resto = N - (NumBlocchi * Kappa)
    FileLibero1 = FreeFile
    Open PrimoFile For Binary As #FileLibero1
    FileLibero2 = FreeFile
    Open SecondoFile For Binary As #FileLibero2
    For K = 1 To NumBlocchi
        '        Debug.Print K; " ";
        DoEvents
        Get #FileLibero1, , BloccoDati1
        Get #FileLibero2, , BloccoDati2
        If StrComp(BloccoDati1, BloccoDati2) <> 0 Then
            SonoUguali = False
            Close FileLibero1, FileLibero2
            Exit Function
        End If
    Next K
    BloccoDati1 = Input(Resto, FileLibero1)
    BloccoDati2 = Input(Resto, FileLibero2)
    If BloccoDati1 <> BloccoDati2 Then
        SonoUguali = False
        Close FileLibero1, FileLibero2
        Exit Function
    End If
    Close FileLibero1, FileLibero2
End Function
______________________________

 Un normalissimo refuso ;-)) Penso intendesse un chunk, cioè un blocco di dati.
He he, non l'ho visto neanche nella risposta. Un super-chuck.

 He he, non l'ho visto neanche nella risposta. Un super-chuck.
No, quello era Superciuck, il nemico del gruppo TNT ! ;-)))
Bye, G.

 No, quello era Superciuck, il nemico del gruppo TNT ! ;-)))
o un superChuckNorris

Grazie a te e a Jimi.
La funzione ........funziona benissimo.
Non capisco però perchè non mi funziona il seguente codice (risultano uguali
anche alcuni files che in realtà sono diversi):
    If FileLen(NomeFile1 ) <> FileLen(NomeFile2 ) Then
       FileDiversi=true
       Exit Sub
    End If
    Open NomeFile1 For Input As #1
    Open NomeFile2 For Input As #2
    Do While Not EOF(1)
        Buffer1 = Input(1, #1)
        Buffer2 = Input(1, #2)
        If Buffer1 <> Buffer2 Then
            FileDiversi = True
            Exit Do
        End If
    Loop
    Close #1
    Close #2
A parte il fatto che il confronto di un carattere alla volta determina tempi
di elaborazione esagerati, dove sbaglio?
Perchè non si può usare l'apertura "for Input" in questo caso?

     If FileLen(NomeFile1 ) <> FileLen(NomeFile2 ) Then


 Perchè non si può usare l'apertura "for Input" in questo caso?
L'utilizzo di Input() in questo caso è corretto, dato che i file
sono aperti "for input".
Mi sarebbe sembrata più verosimile una frase del tipo "risultano
diversi anche alcuni file che in realtà sono (sembrano) uguali".
Se invece dici che risultano uguali benché diversi, non so cosa
dirti, dato che la funzione indicata a occhio lavora correttamente.
In cosa consiste la diversità tra i file?

 Perchè non si può usare l'apertura "for Input" in questo caso?
Io in genere uso For Input per i file di testo e simili, for Binary per i file binari...
Battute a parte, sui manuali trovi tutte le info, l'help è un po' più risicato.
Bye, G.

 
g.d_a...@ilcentro.it
 , altrimenti va bene la solita
gaet...@hotmail.com
 .
Il problema si verifica ad esempio con due files DOC.
Credo proprio che la causa sia quella indicata da Stefano.
Ti invio volentieri due esempi e il programmino VB.
Grazie ancora a tutti per la disponibilità.
CIAO!

 > leggere i singoli byte e confrontarli?
Puo' essere di qualche interesse ricordare il comando DOS fc:
fc /b file1 file2 > %windir%\desktop\cfr.txt
--
Ciao.
Maurizio