有如下目录结构
-- ABC(dir)
-- A(dir)
-- a.txt(file)
-- B(dir)
-- C(dir)
-- b.txt(file)
我想把ABC目录下的所有一级目录下的所有文件(也包括文件夹)COPY到另外一个BCD目录中去,如下
-- BCD
-- a.txt(file)
-- C(dir)
-- b.txt(file)
如何实现呢?
测试的时候请把源目录
和目标目录
换成你本机的
package main
import (
"fmt"
"io"
"os"
"path/filepath"
"strings"
)
func main() {
srcDir := "/Users/du/Desktop/abcd"
destDir := "/Users/du/Desktop/bcd"
directory, err := os.Open(srcDir)
defer directory.Close()
handleError(err)
//只获取第一层文件(目录)信息
files, err := directory.Readdir(1)
handleError(err)
for _, f := range files {
filePath := srcDir + string(filepath.Separator) + f.Name()
if f.IsDir() {
handleDir(srcDir, destDir, filePath)
}
}
// 先处理目录,并创建好,最后拷贝文件,不用每次都判断文件夹是否存在
for _, f := range fileSlice {
handleFile(srcDir, destDir, f)
}
}
var fileSlice []string
func init() {
fileSlice = make([]string, 0, 10)
}
// 处理目录
func handleDir(src, dest, pathDir string) error {
var retErr error
filepath.Walk(pathDir, func(pathStr string, info os.FileInfo, err error) error {
if err != nil {
retErr = err
return err
}
if info.IsDir() {
targetDir := getFinalFilePath(src, dest, pathStr)
fmt.Println("make dir", targetDir)
if err = os.MkdirAll(targetDir, os.ModePerm); err != nil {
retErr = err
return err
}
} else {
fileSlice = append(fileSlice, pathStr)
}
return nil
})
return retErr
}
// 拷贝文件
func copyFile(srcFile, destFile string) error {
file, err := os.Open(srcFile)
if err != nil {
return err
}
defer file.Close()
dest, err := os.Create(destFile)
if err != nil {
return err
}
defer dest.Close()
io.Copy(dest, file)
return nil
}
// 获取要生成的文件(夹)的绝对路径名称
// src 原基目录
// dest 目标基地址
// fileName 文件(简单)名称
func getFinalFilePath(src, dest, fileName string) string {
return strings.Replace(fileName, src, dest, 1)
}
// 处理文件(非目录)
func handleFile(src, dest, fileName string) error {
return copyFile(fileName, getFinalFilePath(src, dest, fileName))
}
func handleError(err error) {
if err != nil {
fmt.Println(err)
os.Exit(1)
}
}