go utils

173 阅读1分钟

递归遍历文件

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)
	}
}