分享
  1. 首页
  2. 文章

使用go语言复制文件

学思 · · 20856 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

怎样使用go语言将文件复制成另一文件?go语言标准包io里提供一个简单的函数copy实现了这个功能,下面是一个例子。

package main
import (
 "fmt"
 "io"
 "os"
)
func main() {
 CopyFile(os.Args[1], os.Args[2]) // os.Args[1]为目标文件,os.Args[2]为源文件
 fmt.Println("复制完成",)
}
func CopyFile(dstName, srcName string) (written int64, err error) {
 src, err := os.Open(srcName)
 if err != nil {
 return
 }
 defer src.Close()
 dst, err := os.OpenFile(dstName, os.O_WRONLY|os.O_CREATE, 0644)
 if err != nil {
 return
 }
 defer dst.Close()
 return io.Copy(dst, src)
}

e:\go_source\Go_program_code\temptest>temptest.exe abc.log ex14061310.log 复制 2917891 字节!

e:\gosource\Goprogram_code\temptest>ls -al
total 3947
drwxr-xr-x 2 sharp Administ 0 Oct 24 10:23 .
drwxr-xr-x 25 sharp Administ 8192 Oct 20 17:20 ..
-rw-r--r-- 1 sharp Administ 2917891 Oct 24 11:05 abc.log
-rw-r--r-- 1 sharp Administ 2917891 Jun 13 10:00 ex14061310.log
-rwxr-xr-x 1 sharp Administ 2236928 Oct 24 11:05 temptest.exe
-rw-r--r-- 1 sharp Administ 520 Oct 24 11:05 temptest.go

注意这里defer的使用,在源文件和目的文件打开后都跟了一个defer延迟关闭文件。如果目标文件后面没有使用defer dst.Close(),那么一旦创建目标文件调试失败,它将直接返回错误,那么,会导致源文件一直保持打开状态,这样资源就得不到释放。因此,在go语言里,记得open一个文件做了错误判断后要紧跟一个defer close延迟调用。

io.Copy的函数原型如下
func Copy(dst Writer, src Reader) (written int64, err error)
Copy函数从源到目的的复制,直到读到源的EOF或者出现其它的错误,它返回所复制的字节数及复制过程出现的第一个错误。如果成功复制,Cop返回的是 err ==nil,因为Copy被定义为从源复制直到遇到EOF,它不把EOF当作一个错误。
io包里还有一个io.CopyN的函数,原型如下
func CopyN(dst Writer, src Reader, n int64) (written int64, err error)
CopyN将从源文件里复制n字节(或者遇到错误中断)到目标文件,并返到实际复制的节数
package main
import (
 "fmt"
 "io"
 "os"
)
func main() {
 counter, := CopyFile(os.Args[1], os.Args[2], os.Args[3]) // os.Args[1]为目标文件,os.Args[2]为源文件
 fmt.Println("复制", counter, "字节!")
}
func CopyFile(dstName, srcName string, n int64) (written int64, err error) {
 src, err := os.Open(srcName)
 if err != nil {
 return
 }
 defer src.Close()
 dst, err := os.OpenFile(dstName, os.OWRONLY|os.OCREATE, 0644)
 if err != nil {
 return
 }
 defer dst.Close()
 return io.CopyN(dst, src, n) //
}
e:\go_source\Go_program_code\temptest>temptest.exe test.go temptest.go 1000
复制 526 字节!

e:\go_source\Go_program_code\temptest>ls -al
total 3948
drwxr-xr-x 2 sharp Administ 0 Oct 24 11:10 .
drwxr-xr-x 25 sharp Administ 8192 Oct 20 17:20 ..
-rw-r--r-- 1 sharp Administ 2917891 Oct 24 11:05 abc.log
-rw-r--r-- 1 sharp Administ 2917891 Jun 13 10:00 ex14061310.log
-rwxr-xr-x 1 sharp Administ 2236928 Oct 24 11:05 temptest.exe
-rw-r--r-- 1 sharp Administ 526Oct 24 11:10 temptest.go
-rw-r--r-- 1 sharp Administ 526 Oct 24 11:10 test.go

有疑问加站长微信联系(非本文作者)

本文来自:开源中国博客

感谢作者:学思

查看原文:使用go语言复制文件

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
20856 次点击
3 回复 | 直到 2025年05月09日 13:38:02
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏