递归遍历文件
package main
import (
"fmt"
"io"
"log"
"os"
"path"
"path/filepath"
)
func main() {
ext := ".go"
src := "E:\\ryan\\proj\\greet"
dest := "e:\\dest"
ergodic(src, dest, ext)
}
func ergodic(fPath string, dest string, ext string) {
if err := filepath.Walk(fPath, func(path string, info os.FileInfo, err error) error {
if filepath.Ext(path) == ext {
copyFile(path, dest)
}
return nil
}); err != nil {
log.Fatal(err)
}
}
func copyFile(src string, dest string) {
dest = path.Join(dest, filepath.Base(src))
srcFile, err := os.Open(src)
if err != nil {
log.Fatal(err)
}
defer srcFile.Close()
destFile, err := os.Create(dest)
if err != nil {
log.Fatal(err)
}
defer destFile.Close()
_, err = io.Copy(srcFile, destFile)
if err != nil {
log.Fatal(err)
}
fmt.Printf("copy %s to %s\n", src, dest)
}
第二种方式
package main
import (
"fmt"
"io"
"io/ioutil"
"log"
"os"
"path"
"path/filepath"
)
func main() {
src := `E:/ryan/proj/greet`
dest := `e:/dest`
ext := ".go"
ergodic(src, dest, ext)
}
func ergodic(fPath, dest, ext string) {
filelist, err := ioutil.ReadDir(fPath)
if err != nil {
log.Fatal(err)
}
for _, file := range filelist {
realpath := path.Join(fPath, file.Name())
if file.IsDir() {
os.Chdir(realpath)
ergodic(realpath, dest, ext)
} else {
if filepath.Ext(realpath) == ext {
copyFile(realpath, dest)
fmt.Printf("copy %s to %s\n", realpath, dest)
}
}
}
}
func copyFile(src, dest string) {
_, err := os.Stat(dest)
if os.IsExist(err) {
err := os.Mkdir(dest, 0777)
if err != nil {
log.Fatal(err)
}
}
srcFile, err := os.Open(src)
if err != nil {
log.Fatal(err)
}
toDestpath := path.Join(dest, path.Base(src))
destFile, err := os.Open(toDestpath)
if err != nil {
log.Fatal(err)
}
_, err = io.Copy(srcFile, destFile)
if err != nil {
log.Fatal(err)
}
}