github.com/josephvusich/fdf@v0.0.0-20230522095411-9326dd32e33f/filecompare.go (about)

     1  package main
     2  
     3  import (
     4  	"bytes"
     5  	"io"
     6  )
     7  
     8  func equalFiles(r1, r2 *fileRecord, o *options) bool {
     9  	f1, err := o.OpenFile(r1.FilePath)
    10  	if err != nil {
    11  		return false
    12  	}
    13  	defer f1.Close()
    14  
    15  	f2, err := o.OpenFile(r2.FilePath)
    16  	if err != nil {
    17  		return false
    18  	}
    19  	defer f2.Close()
    20  
    21  	return equalReaders(f1, f2)
    22  }
    23  
    24  func equalReaders(f1, f2 io.Reader) bool {
    25  	buf1 := make([]byte, 0xFFFFF)
    26  	buf2 := make([]byte, 0xFFFFF)
    27  
    28  	for {
    29  		n1, err1 := f1.Read(buf1)
    30  		n2, err2 := f2.Read(buf2)
    31  
    32  		if err1 == io.EOF && err2 == io.EOF {
    33  			return true
    34  		}
    35  
    36  		if err1 != nil || err2 != nil {
    37  			panic("unexpected read error")
    38  		}
    39  
    40  		if n1 != n2 {
    41  			panic("unexpected read mismatch")
    42  		}
    43  
    44  		if !bytes.Equal(buf1[:n1], buf2[:n2]) {
    45  			return false
    46  		}
    47  	}
    48  }