在Go中复制文件最流行的3种方法
本文将向您展示如何在GO编程语言。尽管Go中有三种以上的复制文件的方法,但本文将介绍三种最常见的方法:这三种方法各有利弊,我们只需要在应用中选择最合适的即可,不必盲目追求性能。
使用io.Copy()从GO库调用函数;一次性读取输入文件并将其写入另一个文件;并使用缓冲区以小块的形式复制文件。
方法1:使用io.Copy()
该实用程序的第一个版本将使用io.Copy()标准GO库的功能。实现中可以找到实用程序的逻辑。copy()职能如下:
除了测试要复制的文件是否存在外(os.Stat(src)),并且是一个常规文件(sourceFileStat.Mode().IsRegular())这样您就可以打开它阅读,所有的工作都是由io.Copy(destination, source)声明。这,这个,那,那个io.Copy()函数返回复制的字节数和复制过程中发生的第一条错误消息。在Go中,如果没有错误消息,则错误变量的值将为nil.
您可以了解更多关于io.Copy()在IO封装文件页。
执行cp1.go将生成下一种输出:
$ run cp1 Please provide two command line arguments $ run cp1 fileCPtxt tmpfileCPCOPY Copied bytes $ diff fileCPtxt tmpfileCPCOPY
这种技术尽可能简单,但不给开发人员带来灵活性,这并不总是一件坏事。但是,有时开发人员需要或希望决定如何读取文件。
方法2:使用ioutil.WriteFile()和ioutil.ReadFile()
复制文件的第二种方法是使用ioutil.ReadFile()和ioutil.WriteFile()职能。第一个函数将整个文件的内容读入字节片,第二个函数将字节片的内容写入文件中。
实用程序的逻辑可以在以下GO代码中找到:
除了这两个if块,它们是工作方式的一部分,您可以看到程序的功能在ioutil.ReadFile()和ioutil.WriteFile()陈述。
执行cp2.go将生成下一种输出:
$ run cp2 Please provide two command line arguments $ run cp2 fileCPtxt tmpcopyFileCP $ diff fileCPtxt tmpcopyFileCP
请注意,尽管此技术将复制一个文件,但是当您想要复制大型文件时,它可能并不有效,因为ioutil.ReadFile()也将是巨大的。
方法3:使用os.Read()和os.Write()
在GO中复制文件的第三种方法是使用cp3.go将在本节中开发的实用程序。它接受三个参数:输入文件的文件名、输出文件的文件名和缓冲区的大小。
最重要的部分cp3.go驻留在以下for循环,可以在copy() function:
这种技术使用os.Read()用于将输入文件的一小部分读入名为buf和os.Write()将缓冲区的内容写入文件。当读取错误或到达文件末尾时,复制过程停止(io.EOF).
执行cp3.go将生成下一种输出:
$ run cp3 usage cp3 source destination BUFFERSIZE $ run cp3 fileCPtxt tmpbuf10 Copying fileCPtxt to tmpbuf10 $ run cp3 fileCPtxt tmpbuf20 Copying fileCPtxt to tmpbuf20
如您所见,缓冲区的大小极大地影响了cp3.go.
做一些基准
本文的最后一部分将尝试比较这三个程序以及cp3.go对于不同的缓冲区大小,请使用time(1)命令行实用程序。
下面的输出显示了cp1.go, cp2.go,和cp3.go复制500 MB文件时:
输出结果表明,这三个实用程序的性能非常相似,这意味着标准GO库的功能非常聪明和优化。
现在,让我们测试缓冲区大小如何影响cp3.go。执行cp3.go如果缓冲区大小为10、20和1,000字节,以便在相当快的计算机上复制500MB文件,生成的输出显示,缓冲区越大,cp3.go实用程序,这或多或少是预期的。此外,使用小于20个字节的缓冲区大小复制大文件是一个非常缓慢的过程,应该避免。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。如果你想了解更多相关内容请查看下面相关链接
- C++文件复制方法总结
- 关于虚拟机复制文件时:无法确定本地文件类型。您可能没有执行此操作的权限。 正在取消文件复制操作。的决解方法
- Java 实现文件复制方法
- 如何从宿主机拖动复制文件到虚拟机VM中的解决方法
- linux下快速删除目录下大量小文件及快速复制大量小文件方法
- Win7系统复制文件时提示“MS-DOS功能无效”的原因及解决方法
- 分析iOS Crash文件:符号化iOS Crash文件的3种方法
- 复制文件时explorer.exe出错解决方法
- Win7下复制文件提示0x80070057错误的解决方法
- Win7复制文件时出现:“您需要权限来执行操作!”(终极解决方法!)
- java使用缓冲流复制文件的方法
- 3种Java从文件路径中获取文件名的方法
- 字符流方法实现复制文件
- PHP按行读取文件时删除换行符的3种方法
- Win7复制大文件时突然崩溃的可行解决方法
- WinXp系统无法复制文件却提示“无法参加目录或文件”的故障分析及两种解决方法
- C#实现复制文件夹中文件到另一个文件夹的方法
- php不使用copy()函数复制文件的方法
- Linux下替换指定的目录及其子目录下所有文件中的某些内容(3种方法)
- windows下用拷贝数据文件的方法复制数据库