golang 复制某一个文件里的所有内容到新建的另外一个文件夹

这里需要使用到一个函数filepath.Walk,它的作用是遍历目录下的所有文件和子目录以及子目录中的所有内容。
filepath.Walk 需要穿两个参数,第一个是你要遍历目录路径,第二个是传一个函数,里面是你要对目录下文件的处理逻辑。

func walkFunc(path string, info os.FileInfo, err error) error {
    fmt.Printf("%s\n", path)
    return nil
}

func main() {
    //遍历打印所有的文件名
    filepath.Walk("C:/Documents and Settings/xxx/Desktop/Copy of change-sub", walkFunc)
}

函数有三个参数,都是固定的,你需要做的就是在里面写逻辑。
现在我们的需求是要将目标文件夹里面的所有内容copy到另外一个文件夹。

package main

import (
	"fmt"
	"io"
	"io/fs"
	"math/rand"
	"os"
	"path/filepath"
	"strconv"
)

func main() {
	targetPath := "template"
	//生成随机文件夹
	randInt := rand.Intn(999) + 1
	destPath := "zip_file/directory"
	destPath = destPath + "/" + strconv.Itoa(randInt)
	//如果目标文件夹不存在,则创建文件夹
	if _, err := os.Stat(destPath); os.IsNotExist(err) {
		if err := os.MkdirAll(destPath, os.ModePerm); err != nil {
			fmt.Printf("Failed to create directory: %s\n", err)
			return
		}
	} else {
		// 目录已存在
		fmt.Printf("Directory already exists: %s\n", destPath)
	}
	err := CopyDir(targetPath, destPath)
	if err != nil {
		fmt.Println("Failed to copy directory:", err)
		return
	}
}
func CopyDir(targetPath string, destPath string) error {
	err := filepath.Walk(targetPath, func(path string, info fs.FileInfo, err error) error {
		if err != nil {
			return err
		}
		destPath := filepath.Join(destPath, path[len(targetPath):])
		//如果是个文件夹则创建这个文件夹
		if info.IsDir() {
			return os.MkdirAll(destPath, info.Mode())
		}
		//如果是文件则生成这个文件
		return copyFile(path, destPath)

	})
	return err
}

// 复制单个文件
func copyFile(srcFile, destFile string) error {
	src, err := os.Open(srcFile)
	if err != nil {
		return err
	}
	defer src.Close()
	//创建复制的文件
	dest, err := os.Create(destFile)
	if err != nil {
		return err
	}
	defer dest.Close()
	//复制内容到文件
	_, err = io.Copy(dest, src)
	if err != nil {
		return err
	}
	//让复制的文件将内容存到硬盘而不是缓存
	err = dest.Sync()
	if err != nil {
		return err
	}

	return nil
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值