golang中io/ioutil.readdir和path/filepath.walk遍历获取目录下文件性能比较

        在使用golang进行开发,获取当前目录下文件或文件列表时候有两种库方法可以供使用。但是那种性能好,在网上没有找到详细的描述,因此自己写了两个函数,进行了下比较。最终发现ioutil的效率要高很高。

具体执行效果,获取一个D盘目录下总共340个文件,比较两个函数耗时明显发现 ioutil的效率要高很多:

golang中io/ioutil.readdir和path/filepath.walk遍历获取目录下文件性能比较_第1张图片

 下面就贴出源代码,大家在这块有更高效的处理,欢迎讨论:


package main

import (
	"fmt"
	"io/ioutil"
	"os"
	"path/filepath"
	"time"
)


func GetAllFile(pathname string, s []string) ([]string, error) {
	fromSlash := filepath.FromSlash(pathname)
	//fmt.Println(fromSlash)
	rd, err := ioutil.ReadDir(fromSlash)
	if err != nil {
		//log.LOGGER("Error").Error("read dir fail %v\n", err)
		fmt.Println("read dir fail:", err)
		return s, err
	}
	for _, fi := range rd {
		if fi.IsDir() {
			fullDir:= filepath.Join(fromSlash,fi.Name())
			s, err = GetAllFile(fullDir, s)
			if err != nil {
				fmt.Println("read dir fail:", err)
				//log.LOGGER("Error").Error("read dir fail: %v\n", err)
				return s, err
			}
		} else {
			fullName:= filepath.Join(fromSlash,fi.Name())
			s = append(s, fullName)
		}
	}
	return s, nil
}

func GetALLFIles_walk(pathname string)([]string){
	StartTime :=time.Now();
	dst_target :=[]string{}
	err := filepath.Walk(pathname, func(src string, f os.FileInfo, err error) error {
		if f == nil {
			return err
		}
		if f.IsDir(){
			return nil
		}else { //进行文件的复制
			dst_target=append(dst_target,src)

			//return s
		}
		//println(path)
		return nil
	})

	if err != nil {
		fmt.Printf("filepath.Walk() returned %v\n", err)
		return nil
		//log.LOGGER("Error").Error("filepath.Walk() returned %v\n", err)
	}
	fmt.Println("Cost Time:",time.Since(StartTime))
	return dst_target
}

func main(){

	s:=[]string{}
	n:=[]string{}
	pathname:="D://go_copysrc"

	fmt.Printf("filepath walk cost time returned \n")
	n = GetALLFIles_walk(pathname)
	fmt.Println("the number of file is %v,content is:%v",len(n),n)

	fmt.Printf("io util cost time returned \n")
	StartTime :=time.Now();
	s,_=GetAllFile(pathname,s)
	fmt.Println("Cost Time:",time.Since(StartTime))
	fmt.Println("the number of file is %v,content is:%v",len(s),s)




}

 

你可能感兴趣的:(golang中io/ioutil.readdir和path/filepath.walk遍历获取目录下文件性能比较)