Golang实现文件复制

news2024/11/16 18:22:38

方法:三种

package zdpgo_file

import (
	"errors"
	"io"
	"os"
)

// CopyFile 使用io.Copy进行文件的复制,同时也会复制文件的所有权限
// @param src 复制文件
// @param des 目标文件
// @return error 错误信息
func CopyFile(src, des string) error {
	// 判断文件是否存在
	if !IsExist(src) {
		return errors.New("要复制的文件不存在")
	}

	// 打开文件
	srcFile, err := os.Open(src)
	if err != nil {
		return err
	}
	defer srcFile.Close()

	// 获取源文件的权限
	fi, _ := srcFile.Stat()
	perm := fi.Mode()

	// 创建目标文件,并复制源文件的所有权限
	desFile, err := os.OpenFile(des, os.O_RDWR|os.O_CREATE|os.O_TRUNC, perm)
	if err != nil {
		return err
	}
	defer desFile.Close()

	// 进行复制
	_, err = io.Copy(desFile, srcFile)

	// 返回
	return err
}

// CopyFileByWriteFile 使用ioutil.WriteFile()和ioutil.ReadFile()
// @param src 复制文件
// @param des 目标文件
// @return error 错误信息
func CopyFileByWriteFile(src, des string) error {
	if !IsExist(src) {
		return errors.New("要复制的文件不存在")
	}

	// 获取源文件的权限
	srcFile, err := os.Open(src)
	if err != nil {
		return err
	}
	fi, _ := srcFile.Stat()
	perm := fi.Mode()
	defer srcFile.Close()

	// 读取文件
	input, err := os.ReadFile(src)
	if err != nil {
		return err
	}

	// 将源文件的内容和权限写入创建的文件
	err = os.WriteFile(des, input, perm)
	if err != nil {
		return err
	}

	// 返回
	return nil
}

// CopyFileByWriteBuffer 使用os.Read()和os.Write()
// @param src 复制文件
// @param des 目标文件
// @param bufSize 缓冲区大小,小于或者等于0的时候,会使用默认1M的缓冲区大小
// @return error 错误信息
func CopyFileByWriteBuffer(src, des string, bufSize int) error {
	// 设置缓冲区大小
	if bufSize <= 0 {
		bufSize = 1 * 1024 * 1024 //1M
	}

	// 构造缓冲区
	buf := make([]byte, bufSize)

	// 打开文件
	srcFile, err := os.Open(src)
	if err != nil {
		return err
	}
	defer srcFile.Close()

	// 获取源文件的权限
	fi, _ := srcFile.Stat()
	perm := fi.Mode()

	// 创建目标文件并写入复制的权限
	desFile, err := os.OpenFile(des, os.O_CREATE|os.O_RDWR|os.O_TRUNC, perm)
	if err != nil {
		return err
	}
	defer desFile.Close()

	// 进行缓冲写入
	var n int
	for {
		n, err = srcFile.Read(buf)
		if err != nil && err != io.EOF {
			return err
		}

		if n == 0 {
			break
		}

		if _, err = desFile.Write(buf[:n]); err != nil {
			return err
		}
	}

	// 返回
	return nil
}

测试

package zdpgo_file

import "testing"

func TestCopyFile(t *testing.T) {
	if err := AddDir("test"); err != nil {
		t.Fatal(err)
	}

	data1 := []struct {
		Src string
		Dst string
	}{
		{"copy_file.go", "test/test1.go"},
		{"copy_file.go", "test/test2.go"},
		{"copy_file.go", "test/test3.go"},
	}

	for _, tt := range data1 {
		v := CopyFile(tt.Src, tt.Dst)
		if v != nil {
			t.Error(v)
		}
	}

	data2 := []struct {
		Src string
		Dst string
	}{
		{"copy_file.go", "test/test11.go"},
		{"copy_file.go", "test/test22.go"},
		{"copy_file.go", "test/test33.go"},
	}
	for _, tt := range data2 {
		v := CopyFileByWriteFile(tt.Src, tt.Dst)
		if v != nil {
			t.Error(v)
		}
	}

	data3 := []struct {
		Src string
		Dst string
	}{
		{"copy_file.go", "test/test111.go"},
		{"copy_file.go", "test/test222.go"},
		{"copy_file.go", "test/test333.go"},
	}
	for _, tt := range data3 {
		v := CopyFileByWriteBuffer(tt.Src, tt.Dst, 0)
		if v != nil {
			t.Error(v)
		}
	}
}

测试结果

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1697730.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MacOS安装Docker-Compose

方法一 按照百度的方法进行安装&#xff0c;我大致复制一下百度的方法 1.确保您已经安装了Docker Desktop。 2.下载Docker Compose二进制文件。 3.将二进制文件移动到/usr/local/bin目录。 4.更改二进制文件的权限&#xff0c;使其可执行。 以下是具体的命令&#xff1a;…

LiveGBS流媒体平台GB/T28181用户手册-用户管理:添加用户、编辑、关联通道、搜索、重置密码

LiveGBS流媒体平台GB/T28181用户手册-用户管理:添加用户、编辑、关联通道、搜索、重置密码 1、用户管理1.1、添加用户1.2、编辑用户1.3、关联通道1.4、重置密码1.5、搜索1.6、删除 2、搭建GB28181视频直播平台 1、用户管理 1.1、添加用户 添加用户&#xff0c;可以配置登陆用户…

git 无法下载UE5源码问题

最近做镜像&#xff0c;突然遇到这个问题。 无法下载&#xff0c;应该如何解决呢&#xff1f; 1.首先 跳过htts ssl验证 2&#xff0c;设置更大的缓冲区 结果还是这个问题&#xff1a;

鹏特资本进入中国市场具有以下一些优势

1. 带来资金&#xff1a;补充国内资金缺口&#xff0c;为企业发展和项目建设提供重要的资金支持。 2. 先进技术和管理经验&#xff1a;有助于推动技术创新和管理水平提升&#xff0c;促进产业升级和优化。 3. 促进竞争&#xff1a;激发国内市场活力&#xff0c;促使本土企业不…

【调和级数】100321. 优质数对的总数 II

本文涉及知识点 调和级数 质数、最大公约数、菲蜀定理 LeetCode100321. 优质数对的总数 II 给你两个整数数组 nums1 和 nums2&#xff0c;长度分别为 n 和 m。同时给你一个正整数 k。 如果 nums1[i] 可以被 nums2[j] * k 整除&#xff0c;则称数对 (i, j) 为 优质数对&#…

网络模型-路由策略

一、路由策略 路由策略(Routing Policy)作用于路由&#xff0c;主要实现了路由过滤和路由属性设置等功能&#xff0c;它通过改变路由属性(包括可达性)来改变网络流量所经过的路径。目的:设备在发布、接收和引入路由信息时&#xff0c;根据实际组网需要实施一些策略&#xff0c…

什么是聚簇索引和非聚簇索引,如何理解回表、索引下推

聚簇索引&#xff08;Clustered Index&#xff09;和非聚簇索引&#xff08;Non-clustered Index&#xff09;是数据库中的两种索引类型&#xff0c;它们在组织和存储数据时有不同的方式。 聚簇索引 聚簇索引简单理解就是将数据与索引放在一起&#xff0c;找到索引即找到了数…

当AWR1843发送完设置的固定帧后,如何使其再发送第一次的帧?

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

Qt 界面上字体自适应控件大小 - 随控件缩放

Qt 界面上字体自适应控件大小 - 随控件缩放 引言一、设计思路二、进阶版大致思路三、参考链接 引言 Qt控件自适应字体大小可以用adjustSize()函数&#xff0c;但字体自适应控件大小并没有现成的函数可调. - 本文实现了按钮上的字体随按钮大小变化而变化 (如上图所示) - 其他控件…

[CISCN2024]-PWN:gostack解析(go语言程序,syscall)

查看保护 ida比较复杂&#xff0c;建议动调配合静态分析程序运行 这里函数返回不用leave和ret&#xff0c;而是利用add rsp和ret&#xff0c;所以要动调查看到底要覆盖哪里。 完整exp&#xff1a; from pwn import* pprocess(./gostack) syscall0x4616c9 pop_rax0x40f984 po…

电子电器架构 - AUTOSAR ON THE AIR

电子电器架构 - AUTOSAR ON THE AIR 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己…

C# 控制台应用模板可生成顶级语句

C# 控制台应用模板可生成顶级语句 项目2024/01/0810 个参与者 反馈 本文内容 使用新的程序样式隐式 using 指令全局 using 指令使用旧程序样式 从 .NET 6 开始&#xff0c;新 C# 控制台应用的项目模板在 Program.cs 文件中生成以下代码&#xff1a; C#复制 // See https…

C语言基础(六)

C语言基础 指针与一维数组总结 * p、* (p)、&#xff08;\*p&#xff09;、* p、*(p)、*p区别和用法运算优先级p与p区别*p与 *&#xff08;p&#xff09;与&#xff08;*p&#xff09;*p与 *&#xff08;p&#xff09;与 *p 指针常量与一维数组的关系指针变量与一维数组的关系数…

基于FIDO2和USBKEY硬件的SSH认证

在 8.2&#xff08;最新为 8.3&#xff09;版本中&#xff0c;OpenSSH 提供了对 FIDO 和 UAF 的支持。从此用户就可以用硬件 USBKEY 证书进行 SSH 原生认证。这样可以实现简捷、有效和安全的 SSH 认证。本文我们就就少一下 FIDO2 以及 OpenSSH 对其的支持&#xff0c;并尝试一下…

十大排序 —— 冒泡排序

十大排序 —— 冒泡排序 什么是冒泡排序基本步骤特点 优化冒泡的各项性能时间复杂度空间复杂度稳定性总结 我们今天来讲一个大家熟悉的老朋友——冒泡排序&#xff1a; 什么是冒泡排序 冒泡排序&#xff08;Bubble Sort&#xff09;是一种简单的排序算法&#xff0c;因其工作…

【大模型部署】在C# Winform中使用文生图Stable Diffusion XL 模型

【大模型部署】在C# Winform中使用文生图Stable Diffusion XL 模型 前言 整了一个在C# Winform中调用文生图Stable Diffusion XL的小程序&#xff0c;基于百度智能云千帆平台 步骤 如何注册百度智能云和创建应用&#xff0c;获取API 密钥等和在之前的博客中基本相同&#…

单日收益1000+看了就会的项目,最新灵异短视频项目,简单好上手可放大操作

各位好友&#xff0c;佳哥在此与大伙儿聊聊一项神秘莫测的短视频项目。你或许会想&#xff0c;“又是一个视频创作项目&#xff1f;” 但别急&#xff0c;这个项目与众不同&#xff0c;日入千元不再是梦&#xff0c;而且它的易用性让人惊喜&#xff0c;无论你是初学者还是资深玩…

面向对象------多态

1.多态的定义 通俗来说&#xff0c;当同一种行为或者事情发生在不同的对象上&#xff0c;这些行为或者事情最终得到的结果不同。 注意&#xff1a;多态要发生在继承的基础上。 例如&#xff1a;彩色打印机和黑白打印机。 彩色打印机和黑白打印机是不同的对象&#xff0c;但…

兵器室管控系统|DW-306是一套成熟系统

概述 智慧兵器室管理系统&#xff08;DW-S306&#xff09;是依托互3D技术、大数据、RFID技术、数据库技术、AI、视频分析技术对RFID智能仓库进行统一管理、分析的信息化、智能化、规范化的系统。 本解决方案利用现有内部网络&#xff0c;部署部队智能兵器室管理系统&#xff…

Python并发编程学习记录

1、初识并发编程 1.1、串行&#xff0c;并行&#xff0c;并发 串行(serial)&#xff1a;一个cpu上按顺序完成多个任务&#xff1b; 并行(parallelism)&#xff1a;任务数小于或等于cup核数&#xff0c;多个任务是同时执行的&#xff1b; 并发(concurrency)&#xff1a;一个…