golang 大文件分割与合并
时间: 2023-11-02 22:17:13 浏览: 147
在 Go 中,可以使用以下方式将大文件分割成多个小文件:
```go
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
const chunkSize = 1024 * 1024 // 1MB
// 打开源文件
srcFile, err := os.Open("bigfile.txt")
if err != nil {
panic(err)
}
defer srcFile.Close()
// 逐个读取源文件的 chunk
chunk := make([]byte, chunkSize)
for i := 0; ; i++ {
n, err := srcFile.Read(chunk)
if err != nil {
if err == io.EOF {
break // 文件结束
} else {
panic(err)
}
}
// 创建新文件
dstFileName := fmt.Sprintf("part-%d.txt", i)
dstFile, err := os.Create(dstFileName)
if err != nil {
panic(err)
}
defer dstFile.Close()
// 将 chunk 写入新文件
_, err = dstFile.Write(chunk[:n])
if err != nil {
panic(err)
}
}
}
```
上述代码中,我们使用了 `os.Open` 函数打开源文件,然后使用 `os.Create` 函数创建新文件。我们逐个读取源文件的 chunk,将每个 chunk 写入新文件。
接下来,我们来看看如何将多个小文件合并成一个大文件:
```go
package main
import (
"fmt"
"io"
"os"
)
func main() {
// 创建目标文件
dstFile, err := os.Create("bigfile.txt")
if err != nil {
panic(err)
}
defer dstFile.Close()
// 逐个读取小文件并写入目标文件
for i := 0; ; i++ {
srcFileName := fmt.Sprintf("part-%d.txt", i)
srcFile, err := os.Open(srcFileName)
if err != nil {
if err == io.EOF {
break // 没有更多文件
} else {
panic(err)
}
}
defer srcFile.Close()
// 将小文件写入目标文件
_, err = io.Copy(dstFile, srcFile)
if err != nil {
panic(err)
}
}
}
```
上述代码中,我们使用 `os.Create` 函数创建目标文件,然后逐个读取小文件并写入目标文件。我们使用 `io.Copy` 函数将小文件的内容写入目标文件。
需要注意的是,如果您处理的是二进制文件,可能需要使用 `os.OpenFile` 和 `os.Create` 函数的 `O_BINARY` 标志。另外,还需要注意文件名的编码和路径分隔符的问题。
阅读全文