package main
import (
"fmt"
"io/ioutil"
"os"
"strings"
)
var (
srcDir string //源文件夹路径
srctoDir string //目标文件夹路径
jishu int //复制文件数目
dirst []string //拆分文件相对路径
srctoName string //目标文件绝对路径
oldFile string //源文件绝对路径
err error //错误
)
func main() {
fmt.Println("输入源文件夹路径:")
fmt.Scanln(&srcDir)
fmt.Println("输入目标文件夹路径:")
fmt.Scanln(&srctoDir)
jishu = 0
pathSeparator := string(os.PathSeparator) //路径分隔符
listAllFileByName(pathSeparator, srcDir)
fmt.Printf("已完成%v个文件复制,回车键退出!\n", jishu)
fmt.Scanln(&srcDir) //完成后暂停,防止直接关闭,看不到信息,回车后关闭。
}
func listAllFileByName(pathSeparator string, fileDir string) {
files, _ := ioutil.ReadDir(fileDir) //读取目录
for _, onefile := range files { //遍历目录下文件
if onefile.IsDir() { //是文件夹,继续递归遍历
listAllFileByName(pathSeparator, fileDir+pathSeparator+onefile.Name())
} else { //是文件
oldFile = fmt.Sprintf("%s%s%s", fileDir, pathSeparator, onefile.Name()) //拼接源文件绝对路径
dirst = strings.Split(oldFile, srcDir) //分割相对路径
//dirst[1]:去掉srcDir的相对目录
srctoName = fmt.Sprintf("%s%s", srctoDir, dirst[1]) //拼接目标文件绝对路径
_, err = os.Lstat(srctoName) //目标文件信息,判断目标文件是否存在(只判断是否有同文件名文件)
if err != nil { //目标文件不存在时,复制文件到目标文件
fileCopy(oldFile, srctoName, onefile.Name())
}
}
}
}
func fileCopy(oldFile, newFile, srctoDir string) {
toPath := strings.Split(newFile, srctoDir)
_, err = os.Lstat(toPath[0]) //目标文件所在的目录
if err != nil { //目录不存在,创建目录
err = os.MkdirAll(toPath[0], 0777)
}
input, err := ioutil.ReadFile(oldFile) //读取源文件
if err != nil {
return
}
err = ioutil.WriteFile(newFile, input, 0777) //将源文件,写入目标文件
if err != nil {
return
}
fmt.Println(newFile) //输出复制完成的目标文件绝对路径
jishu++ //计数器+1
}
以下为编译完成的: