想法
在项目中,遇到一个场景在windows下把目录进行拷贝到另一个盘符中。接触到这个需求时,存在以下两种主要方法:
-
使用golang原生库,通过filepath.walk+io.copy完成。 -
既然是windows下,那么也可以通过调用windows的已有命令完成。
问题来了,这两种方案的时间消耗如何?所以做了以下的功能测试。
你将学习到什么
windows环境下拷贝目录的方案 windows下,golang的一些操作方法
方案测试
测试机器:windows i7。
测试代码: https://github.com/toheart/golearn/tree/main/file/windows (具体代码查看)
测试方案:
-
使用原生golang库。 -
通过cmd命令调用windows的xcopy命令。 -
通过cmd命令调用windows下的robocopy命令。
★
为什么使用了xcopy命令,还需要测试robocopy命令?
xcopy命令属于较为老的拷贝目录命令,存在一个问题,在path的长度超过254后,会报:内存不足的错误。 对,没错是内存不足,不管你的内容咋样,长度大于254就是内存不足。
在测试过程中,拷贝了本地盘的5G的目录文件,测试比较如下:
方案 | 耗时 |
---|---|
golang原生库 | 58.39s |
xcopy | 40.64s |
robocopy(12线程) | 26.42s |
golang原生库,多开并发线程 | 50.53s |
这里为什么还测试了并发线程的原生库?
原因是:在robocopy中开了12个线程并行处理,而方案一为串行,为了测试的严谨性,所以又测试了并发线程的代码。
结合以上测试,为了使用到最高的效率,我将方案选择了通过命令调用robocopy。
这里还会有个问题。
以上的测试,肯定是golang代码写的性能有问题,所以导致以上的结果,继续优化golang的代码,肯定比调用windows命令高,毕竟调用命令需要创建powershell,然后再执行(最近喜欢跟自己抬杠)。
答:首先,在工作过程中,需要快速满足当前的需求,存在现有方案/轮子的情况下,我也会优先选择现有的,而而不是为了炫技去自己实现一套。这样可以更快的,更有效率的完成工作。
第二个是能力问题,我不觉得自己写的代码会比windows的专业工程师好以及golang的标准库作者好,如果为了证明自己,这样也会让自己陷入到没必要的内耗中。
明确自己的目的,非常重要。
小结
在windows下,进行程序的编写,golang语言也提供了标准库,如 https://pkg.go.dev/golang.org/x/sys/windows 。也可以通过加载windows的动态库来调用windows的api来实现自己的需求。
另外,程序运行下windows下,由于经常在linux下进行操作,难免会存在变扭。 这里可以通过powershell完成linux下的操作,只需要转换一下命令即可。这里推荐一个命令:
Get-Help <command> -detailed
查看具体命令的细节,即linux下的–help或者man手册。
原文始发于微信公众号(小唐云原生):【经验项】windows下如何更快的复制目录
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/270871.html