这里需要使用到一个函数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
}