设计方案
- 异常处理:在Go语言的
io
包操作文件时,每个io
操作(如Read
、Write
等)都可能返回错误。通过检查这些错误,我们可以捕获网络不稳定、文件损坏等异常情况,并进行相应处理。
- 数据完整性校验:可以使用哈希算法(如MD5、SHA-256等)来计算源文件和目标文件的哈希值,对比两者是否一致,以此校验数据完整性。
关键代码片段
package main
import (
"crypto/md5"
"fmt"
"io"
"os"
)
func copyFile(src, dst string) error {
srcFile, err := os.Open(src)
if err != nil {
return err
}
defer srcFile.Close()
dstFile, err := os.Create(dst)
if err != nil {
return err
}
defer dstFile.Close()
_, err = io.Copy(dstFile, srcFile)
if err != nil {
return err
}
return nil
}
func calculateMD5(filePath string) ([]byte, error) {
file, err := os.Open(filePath)
if err != nil {
return nil, err
}
defer file.Close()
hash := md5.New()
if _, err := io.Copy(hash, file); err != nil {
return nil, err
}
return hash.Sum(nil), nil
}
func main() {
src := "source.txt"
dst := "destination.txt"
// 复制文件
if err := copyFile(src, dst); err != nil {
fmt.Printf("文件复制失败: %v\n", err)
return
}
// 计算源文件和目标文件的MD5值
srcMD5, err := calculateMD5(src)
if err != nil {
fmt.Printf("计算源文件MD5失败: %v\n", err)
return
}
dstMD5, err := calculateMD5(dst)
if err != nil {
fmt.Printf("计算目标文件MD5失败: %v\n", err)
return
}
// 对比MD5值
if fmt.Sprintf("%x", srcMD5) == fmt.Sprintf("%x", dstMD5) {
fmt.Println("文件复制成功,数据完整")
} else {
fmt.Println("文件复制成功,但数据可能不完整")
}
}
整体设计说明
copyFile
函数:该函数负责使用io.Copy
进行文件复制。os.Open
打开源文件,os.Create
创建目标文件,然后io.Copy
将源文件内容复制到目标文件。每个步骤都进行错误检查,如果出现错误,函数返回相应错误。
calculateMD5
函数:该函数用于计算文件的MD5哈希值。通过os.Open
打开文件,然后使用io.Copy
将文件内容写入md5.New()
创建的哈希对象中,最后返回计算出的MD5值。
main
函数:首先调用copyFile
进行文件复制,若复制失败则打印错误信息并返回。然后分别计算源文件和目标文件的MD5值,若计算失败则打印错误信息并返回。最后对比两个MD5值,判断文件复制后的数据完整性,并打印相应结果。通过这种方式,实现了一个健壮的文件复制方案,包含异常处理和数据完整性校验。