在使用golang进行开发,获取当前目录下文件或文件列表时候有两种库方法可以供使用。但是那种性能好,在网上没有找到详细的描述,因此自己写了两个函数,进行了下比较。最终发现ioutil的效率要高很高。
具体执行效果,获取一个D盘目录下总共340个文件,比较两个函数耗时明显发现 ioutil的效率要高很多:
下面就贴出源代码,大家在这块有更高效的处理,欢迎讨论:
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)
}