github.com/cloud-foundations/dominator@v0.0.0-20221004181915-6e4fee580046/lib/fsutil/compare.go (about)

     1  package fsutil
     2  
     3  import (
     4  	"bytes"
     5  	"io"
     6  	"os"
     7  )
     8  
     9  func compareFile(buffer []byte, filename string) (bool, error) {
    10  	file, err := os.Open(filename)
    11  	if err != nil {
    12  		return false, err
    13  	}
    14  	defer file.Close()
    15  	fi, err := file.Stat()
    16  	if err != nil {
    17  		return false, err
    18  	}
    19  	if int64(len(buffer)) != fi.Size() {
    20  		return false, nil
    21  	}
    22  	fileBuffer := make([]byte, 65536)
    23  	for {
    24  		nRead, err := io.ReadFull(file, fileBuffer)
    25  		if err != nil && err != io.EOF && err != io.ErrUnexpectedEOF {
    26  			return false, err
    27  		}
    28  		if nRead == 0 {
    29  			break
    30  		}
    31  		if bytes.Compare(buffer[:nRead], fileBuffer[:nRead]) != 0 {
    32  			return false, nil
    33  		}
    34  		buffer = buffer[nRead:]
    35  	}
    36  	return true, nil
    37  }
    38  
    39  func compareFiles(leftFilename, rightFilename string) (bool, error) {
    40  	leftFile, err := os.Open(leftFilename)
    41  	if err != nil {
    42  		return false, err
    43  	}
    44  	defer leftFile.Close()
    45  	leftFI, err := leftFile.Stat()
    46  	if err != nil {
    47  		return false, err
    48  	}
    49  	rightFile, err := os.Open(rightFilename)
    50  	if err != nil {
    51  		return false, err
    52  	}
    53  	defer rightFile.Close()
    54  	rightFI, err := rightFile.Stat()
    55  	if err != nil {
    56  		return false, err
    57  	}
    58  	if leftFI.Size() != rightFI.Size() {
    59  		return false, nil
    60  	}
    61  	leftBuffer := make([]byte, 65536)
    62  	rightBuffer := make([]byte, 65536)
    63  	for {
    64  		nLeft, err := io.ReadFull(leftFile, leftBuffer)
    65  		if err != nil && err != io.EOF && err != io.ErrUnexpectedEOF {
    66  			return false, err
    67  		}
    68  		nRight, err := io.ReadFull(rightFile, rightBuffer)
    69  		if err != nil && err != io.EOF && err != io.ErrUnexpectedEOF {
    70  			return false, err
    71  		}
    72  		if nLeft != nRight {
    73  			return false, nil
    74  		}
    75  		if nLeft == 0 {
    76  			break
    77  		}
    78  		if bytes.Compare(leftBuffer[:nLeft], rightBuffer[:nRight]) != 0 {
    79  			return false, nil
    80  		}
    81  	}
    82  	return true, nil
    83  }