언제 만들었는지는 잘 기억도 안나지만.....폴더 구석에서 찾은 Go를 이용한 크기가 동일한 2개 파일이 같은지 비교하는 프로그램

(평문을 암호화했다가 다시 복호화해서 원본과 같은지 잠깐 확인해보려고 했던가...?)

 

main은 간단히 보면 파일 2개를 읽어서 비교, 일치하면 OkCnt 증가 

var bufSize = 512

func main() {
	file1 := os.Args[1]
	file2 := os.Args[2]

	f1, idx1 := readFile(file1)
	f2, _ := readFile(file2)
	okCnt := 0
	match := 0
	for i := 0; i < idx1+1; i++ {
		match = 0
		for j := 0; j < len(f1[idx1]); j++ {
			if f1[idx1][j] != f2[idx1][j] {
				fmt.Println("not match")
				match = 1
			}
		}
		if match == 0 {
			okCnt++
		}
	}
	fmt.Println("okcnt : ", okCnt)
}

 

 

파일을 읽을 때 사용한 함수 

파일 전체 크기를 버퍼 크기 512바이트를 기준으로 나누고 [][]byte를 만들어 파일을 모두 읽음

해당 읽은 파일의 버퍼와 Index수를 반환하는 함수

func readFile(inputFile string) ([][]byte, int) {
	file, err := os.Open(inputFile)
	if err != nil {
		fmt.Println(err)
	}
	defer file.Close()

	testBufSize := bufSize
	fileStat, err := file.Stat()
	if err != nil {
		fmt.Println(err)
		return nil, -1
	}
	fb := bufio.NewReader(file)
	var fileData [][]byte
	fileSize := fileStat.Size()
	idx := int(fileSize) / testBufSize
	remain := int(fileSize) % testBufSize
	fmt.Println("filesize : ", fileSize, "idx :", idx, "remain", remain)
	if remain != 0 {
		idx = idx + 1
	}
	fileData = make([][]byte, idx)

	dataIdx := 0
	// filelen := 0

	for i := 0; i < idx; i++ {
		if remain != 0 {
			if i == idx-1 {
				fileData[i] = make([]byte, remain)
				// filelen += len(decryptDataBuf[i])
				io.ReadFull(fb, fileData[dataIdx])
				// fmt.Println("F Len ", filelen, "dlen :", len(fileData[dataIdx]))
				break
			}
		}
		fileData[i] = make([]byte, testBufSize)
		// filelen += len(decryptDataBuf[i])

		io.ReadFull(fb, fileData[dataIdx])
		// fmt.Println("F Len ", filelen, "dlen :", len(fileData[dataIdx]))
		dataIdx++
	}

	return fileData, dataIdx

}

 

실제 동일한 파일을 이름만 바꾸어 테스트한 결과와 크기가 다른 파일을 테스트한 결과 

크기가 다른 파일이면 버퍼의 index가 일치하지 않아서 바로 오류가 나버리는 급조한 프로그램... 

 

반응형

+ Recent posts