使用go语言复制文件

怎样使用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:\go_source\Go_program_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.O_WRONLY|os.O_CREATE, 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      
526 Oct 24 11:10 temptest.go

-rw-r--r--    1 sharp    Administ    
 
 526
 Oct 24 11:10 test.go

时间: 2024-10-02 06:35:25

使用go语言复制文件的相关文章

C语言复制文件的两种简单的方法【从根本解决问题】

网上的方法大致有这样几种: 1.使用操作系统提供的复制文件的API 2.使用C语言本身提供的复制文件的函数 3.直接读写文件,从文件角度来操作,从而直接将一个文件复制 这里我们使用的就是这第三种. 复制文件的思路大概是这样的,如果是文本类型,则可直接使用字符读写的方式,依次读写到另一个文件中.但如果是非字符型文件那应该怎么进行操作呢?我的方法是使用二进制形式打开,然后依次针对字节进行操作,依次从文件第一个字节读写至最后一个字节实现文件的复制,那么由此可得,这种方法同样可以用在远程的操作上,即实现

R语言 复制文件,复制目录

file.info file.create dir.create file.copy if(!dir.exists("Result_Dir")){         dir.create("Result_Dir")     } setwd("Result_Dir") # Folder _ 2 dir.create("2_test", showWarnings = TRUE, recursive = FALSE) if(file.

c语言复制文件程序

#include <stdio.h> #include <stdlib.h> #include <string.h> #define SIZE 1024*1024*10 int main() { FILE *fp_read, *fp_write; fp_read = fopen("E:\\CentOS-6.5\\CentOS-6.5-i386-bin-DVD1.iso","rb"); fp_write = fopen("

oc语言复制视频文件

1 void copyFile() 2 { 3 NSString *home=NSHomeDirectory(); 4 NSString *path=[NSString stringWithFormat:@"%@/desktop/oc.mp4",home]; 5 NSString *path1=[NSString stringWithFormat:@"%@/desktop/oc1.mp4",home]; 6 NSFileHandle *handle=[NSFileH

阶段1 语言基础+高级_1-3-Java语言高级_07 缓冲流_4_缓冲流的效率测试_复制文件

把之前文件复制的代码复制到这里 一个字节一个字节的读取,复制文件 byte数组的形式 缓冲流测试 数组缓冲 原文地址:https://www.cnblogs.com/wangjunwei/p/11270108.html

(转) C语言头文件、库文件的查找路径

在程序设计中,文件包含是很有用的.一个大的程序可以分为多个模块,由多个程序员分别编程.有        些公    用的符号常量或宏定义等可单独组成一个文件,在其它文件的开头用包含命令包含该文件即可使        用.这样,可避免在每个文件开头都去书写那些公用量,从而节省时间,并减少出错. 对文件包含命令还要说明以下几点:1. 包含命令中的文件名可以用双引号括起来,也可以用尖括号括起来.例如以下写法都是允许的:    #include"stdio.h"    #include   

R语言进行文件夹操作示例(转)

rm(list=ls())path = 'J:/lab/EX29 --在R语言中进行文件(夹)操作'setwd(path)cat("file A\n", file="A") #创建一个文件A,文件内容是'file A','\n'表示换行,这是一个很好的习惯cat("file B\n", file="B")  #创建一个文件Bfile.append("A", "B")  #将文件B的内容附

用R语言进行文件系统管理

阅读导读: 1.R语言如何检查文件或目录是否存在?如何重命名一个文件? 2.R语言如何查看和修改目录的权限? 3.R语言如何删除一个文件? 4.用R语言管理一个文件系统时,都有哪些特殊的目录? 5.如何查看R软件指定包所在目录? 1. 文件系统介绍 计算机的文件系统是一种存储和组织计算机数据的方法,它使得对其访问和查找变得容易,文件系统使用文件和树形目录的抽象逻辑概念代替了硬盘和光盘等物理设备使用数据块的概念,用户使用文件系统来保存数据不必关心数据实际保存在硬盘(或者光盘)的地址为多少的数据块上

C语言头文件、库文件的查找路径

在 程序设计中,文件包含是很有用的.一个大的程序可以分为多个模块,由多个程序员分别编程.有些公用的符号常量或宏定义等可单独组成一个文件,在其它文件的开头用包含命令包含该文件即可使用.这样,可避免在每个文件开头都去书写那些公用量,从而节省时间,并减少出错. 对文件包含命令还要说明以下几点:1. 包含命令中的文件名可以用双引号括起来,也可以用尖括号括起来.例如以下写法都是允许的:    #include"stdio.h"    #include    但是这两种形式是有区别的:使用尖括号表