GoLang Filepath.Walk遍历优化

原生标准库在文件量过大时效率和内存均表现不好

1400万文件遍历Filepath.Walk

1400万文件重写直接调用windows api并处理细节

结论

1400万文件遍历时对比

对比条目 filepath.walk windows api并触发黑科技
运行时间 710秒 22秒
内存占用 480M 38M

关键代码

go 复制代码
//超级快的文件遍历
func FindFileWin(dir string, callbackfunc MyFindFileCallBack) {

	dir = dir + `\`

	finstruct := win.WIN32_FIND_DATAW{}
	handle := win.FindFirstFileW(dir+`*`, &finstruct)
	if win.IsInvalidHandle(handle) {

		for {
			//文件夾
			if (finstruct.DwFileAttributes & win.FILE_ATTRIBUTE_DIRECTORY) != 0 {
				if (finstruct.CfileNameGo != "..") && (finstruct.CfileNameGo != ".") {
					FindFileWin(dir+finstruct.CfileNameGo, callbackfunc)
				}
			} else {
				callbackfunc(dir + finstruct.CfileNameGo)
			}
			if win.FindNextFileW(handle, &finstruct) == 0 {
				break
			}
		}
	}
}
go 复制代码
var (
	kernel32           = syscall.NewLazyDLL("Kernel32.dll")
	procCreateFileW    = kernel32.NewProc("CreateFileW")
	procOpenEventW     = kernel32.NewProc("OpenEventW")
	procSetEvent       = kernel32.NewProc("SetEvent")
	procFindFirstFileW = kernel32.NewProc("FindFirstFileW")
	procFindNextFileW  = kernel32.NewProc("FindNextFileW")

	//procCreateFileA = kernel32.NewProc("CreateFileA")
)

func FindFirstFileW(fileName string, lpFindFileData *WIN32_FIND_DATAW) HANDLE {
	strname := unsafe.Pointer(syscall.StringToUTF16Ptr(fileName))
	handle, _, _ := procFindFirstFileW.Call(
		uintptr(strname),
		uintptr(unsafe.Pointer(lpFindFileData)),
	)
	if handle != 0 {

		lpFindFileData.CfileNameGo = syscall.UTF16ToString(lpFindFileData.cFileName[:])
	}
	return HANDLE(handle)
}
func IsInvalidHandle(handle HANDLE) bool {
	if handle != 0 && int(handle) != -1 {
		return true
	}
	return false
}
func FindNextFileW(hFindFile HANDLE, lpFindFileData *WIN32_FIND_DATAW) BOOL {
	ret, _, _ := procFindNextFileW.Call(
		uintptr(hFindFile),
		uintptr(unsafe.Pointer(lpFindFileData)),
	)
	if ret != 0 {

		lpFindFileData.CfileNameGo = syscall.UTF16ToString(lpFindFileData.cFileName[:])
	}
	return BOOL(ret)
}
相关推荐
fish_xk16 小时前
c++中的引用和数组
开发语言·c++
酒尘&19 小时前
JS数组不止Array!索引集合类全面解析
开发语言·前端·javascript·学习·js
无限大619 小时前
计算机十万个为什么--数据库索引
后端
冬夜戏雪20 小时前
【java学习日记】【2025.12.7】【7/60】
java·开发语言·学习
xwill*20 小时前
分词器(Tokenizer)-sentencepiece(把训练语料中的字符自动组合成一个最优的子词(subword)集合。)
开发语言·pytorch·python
学历真的很重要20 小时前
VsCode+Roo Code+Gemini 2.5 Pro+Gemini Balance AI辅助编程环境搭建(理论上通过多个Api Key负载均衡达到无限免费Gemini 2.5 Pro)
前端·人工智能·vscode·后端·语言模型·负载均衡·ai编程
福大大架构师每日一题20 小时前
go-zero v1.9.3 版本更新:一致性哈希负载均衡、gRPC优化、链路追踪修复、ORM完善等重要提升
golang·负载均衡·哈希算法
咖啡の猫20 小时前
Python列表的查询操作
开发语言·python
quikai198121 小时前
python练习第三组
开发语言·python
JIngJaneIL21 小时前
基于Java非遗传承文化管理系统(源码+数据库+文档)
java·开发语言·数据库·vue.js·spring boot