首页 > golang copy文件的问题

golang copy文件的问题

有如下目录结构

-- 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)
    }
}
【热门文章】
【热门文章】