mirror of
https://github.com/unknwon/the-way-to-go_ZH_CN.git
synced 2025-08-12 06:36:43 +08:00
Fixed a that if dstName file's length longer than srcName file io.Copy will cover only part content of srcName file. If file srcName 's content is "abc", dstName's content is "1234" ,the result of io.Copy(dst, src) is "abc4" not "abc"
46 lines
950 B
Markdown
46 lines
950 B
Markdown
# 12.3 文件拷贝
|
||
|
||
如何拷贝一个文件到另一个文件?最简单的方式就是使用 io 包:
|
||
|
||
示例 12.10 [filecopy.go](examples/chapter_12/filecopy.go):
|
||
|
||
```go
|
||
// filecopy.go
|
||
package main
|
||
|
||
import (
|
||
"fmt"
|
||
"io"
|
||
"os"
|
||
)
|
||
|
||
func main() {
|
||
CopyFile("target.txt", "source.txt")
|
||
fmt.Println("Copy done!")
|
||
}
|
||
|
||
func CopyFile(dstName, srcName string) (written int64, err error) {
|
||
src, err := os.Open(srcName)
|
||
if err != nil {
|
||
return
|
||
}
|
||
defer src.Close()
|
||
|
||
dst, err := os.Create(dstName)
|
||
if err != nil {
|
||
return
|
||
}
|
||
defer dst.Close()
|
||
|
||
return io.Copy(dst, src)
|
||
}
|
||
```
|
||
|
||
注意 `defer` 的使用:当打开目标文件时发生了错误,那么 `defer` 仍然能够确保 `src.Close()` 执行。如果不这么做,文件会一直保持打开状态并占用资源。
|
||
|
||
## 链接
|
||
|
||
- [目录](directory.md)
|
||
- 上一节:[文件读写](12.2.md)
|
||
- 下一节:[从命令行读取参数](12.4.md)
|