github.com/Cloud-Foundations/Dominator@v0.3.4/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 }