golang基于window下实现文件遍历(效率高于filepath.Wlak)

golang基于window下实现文件遍历(效率高于filepath.Wlak)

package main

import (
	"fmt"
	"os"
	"path"
	"path/filepath"
	"syscall"
	"time"
	"unsafe"
)

const MAX_PATH = 260

type FILETIME struct {
	dwLowDateTime  uint32
	dwHighDateTime uint32
}

type WIN32_FIND_DATAW struct {
	dwFileAttributes   uint32
	ftCreationTime     FILETIME
	ftLastAccessTime   FILETIME
	ftLastWriteTime    FILETIME
	nFileSizeHigh      uint32
	nFileSizeLow       uint32
	dwReserved0        uint32
	dwReserved1        uint32
	cFileName          [MAX_PATH]uint16
	cAlternateFileName [14]uint16
	dwFileType         uint32
	dwCreatorType      uint32
	wFinderFlags       uint16
	FileName           string
}
type IndexEntry2 struct {
	Name string
	Path string
	Size uint64
}

var (
	kernel32           = syscall.NewLazyDLL("Kernel32.dll")
	procFindFirstFileW = kernel32.NewProc("FindFirstFileW")
	procFindNextFileW  = kernel32.NewProc("FindNextFileW")
	procFindClose      = kernel32.NewProc("FindClose")
)

type HANDLE uintptr

const (
	FILE_ATTRIBUTE_DIRECTORY = 0x10
)

func FindFirstFileW(lpFileName string, lpFindFileData *WIN32_FIND_DATAW) HANDLE {
	name, _ := syscall.UTF16PtrFromString(lpFileName)
	pathPtr := uintptr(unsafe.Pointer(name))
	handle, _, _ := procFindFirstFileW.Call(pathPtr, uintptr(unsafe.Pointer(lpFindFileData)), 0)
	return HANDLE(handle)
}

func FindNextFileW(hFindFile HANDLE, lpFindFileData *WIN32_FIND_DATAW) bool {
	ret, _, _ := procFindNextFileW.Call(uintptr(hFindFile), uintptr(unsafe.Pointer(lpFindFileData)), 0)
	return ret != 0
}

func FindClose(hFindFile HANDLE) bool {
	ret, _, _ := procFindClose.Call(uintptr(hFindFile))
	return ret != 0
}
func FindFileWin(dir string) []IndexEntry2 {
	list := make([]IndexEntry2, 0)
	var findData WIN32_FIND_DATAW
	globalPath := dir + "\\*"
	hFindFile := FindFirstFileW(globalPath, &findData)
	if hFindFile != 0 {
		defer FindClose(hFindFile)

		for {
			fileName := syscall.UTF16ToString(findData.cFileName[:])
			//文件夾
			if (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0 {
				if (fileName != "..") && (fileName != ".") {
					subPath := path.Join(dir, fileName)
					list = append(list, FindFileWin(subPath)...)
				}
			} else {
				list = append(list, IndexEntry2{
					Name: fileName,
					Size: uint64(findData.nFileSizeLow) | (uint64(findData.nFileSizeHigh) << 32),
					Path: path.Join(dir, fileName),
				})
			}
			if !FindNextFileW(hFindFile, &findData) {
				break // End of search
			}

		}
	}
	return list
}
func FileWalk(dir string) []IndexEntry2 {
	list := make([]IndexEntry2, 0)
	filepath.Walk(dir, func(path string, info os.FileInfo, err error) error {
		if info.IsDir() {
			return nil
		}
		list = append(list, IndexEntry2{
			Path: path,
			Size: uint64(info.Size()),
			Name: info.Name(),
		})
		return nil
	})
	return list
}

func main() {
	startTime := time.Now()
	// Replace the path with the desired directory path
	dir := `E:\`

	fmt.Println(len(FindFileWin(dir)))
	// fmt.Println(len(FileWalk(dir)))
	fmt.Printf("共花费时间 %.3f seconds\n", time.Since(startTime).Seconds())
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/269245.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

html之为什么使用表单,常用表单元素使用?

文章目录 一、为什么使用表单呢&#xff1f;二、常用表单元素使用三、总结 一、为什么使用表单呢&#xff1f; 为什么使用表单呢&#xff0c;使用表单是为了更好的收集用户数据&#xff0c;并且安全 二、常用表单元素使用 1、password密码框 密码框&#xff1a;会隐藏数据&a…

06.微服务组件 Gateway

1、Gateway 简介 在SpringCloud中网关的实现包括两种&#xff1a; Zuul是基于Servlet的实现&#xff0c;属于阻塞式编程。SpringCloudGateway是基于Spring5中提供的WebFlux心属于响应式编程的实现&#xff0c;具备更好的性能。 2、搭建网关服务 步骤一&#xff1a;创建gatewa…

TwIST算法MALTLAB主程序详解

TwIST算法MALTLAB主程序详解 关于TwIST算法的具体原理可以参考&#xff1a; 链接: https://ieeexplore.ieee.org/abstract/document/4358846 链接: https://blog.csdn.net/jbb0523/article/details/52193209 该算法的MATLAB源代码&#xff1a; 链接: http://www.lx.it.pt/~bi…

Unity查安卓Native Crash的方法,定位SO报错函数

需要用到两个工具Il2CppDumper和IDA_Pro&#xff0c;网上可以下到对应的软件 可以看到报错的位置是libil2cpp.so 0000000000AFF820 接下来要做的事情就是找到0000000000AFF820对应的函数是哪个 解包 Il2CppDumper解析so文件和符号表&#xff0c;查看对应的函数表 把apk后缀…

Cloudstack多个管理服务器节点

https://docs.cloudstack.apache.org/en/4.18.0.0/adminguide/reliability.html 参考翻译&#xff1a; 代理上支持多个管理服务器 在具有多个管理服务器的Cloudstack环境中&#xff0c;可以根据算法配置代理&#xff0c;将其连接到哪个管理服务器。这对于内部负载均衡器或高可…

大数据----MapReduce实现统计单词

目录 一、简介二、实现单词统计数据准备编程MapReduceJob 三、运行四、结果 一、简介 Hadoop MapReduce 是一个编程框架&#xff0c;它可以轻松地编写应用程序&#xff0c;以可靠的、容错的方式处理大量的数据(数千个节点)。 正如其名&#xff0c;MapReduce 的工作模式主要分…

docker部署mysql主主备份 haproxy代理(swarm)

docker部署mysql主主备份 haproxy代理&#xff08;swarm&#xff09; docker部署mysql主主备份 docker部署mysql主主备份&#xff08;keepalived&#xff09;跨主机自动切换 docker部署mysql主主备份 haproxy代理&#xff08;swarm&#xff09; 1. 环境准备 主机IPnode119…

28、清华大学脑机接口实验组SSVEP数据集:通过视觉触发BCI[飞一般的赶脚!]

前言&#xff1a; 哈喽&#xff0c;最近对清华大学脑机接口的数据进行了尝试&#xff0c;输入到了DL模型中&#xff0c;以下是本人对于清华BCI数据的个人见解。 数据地址&#xff1a; 清华大学脑机接口研究组 (tsinghua.edu.cn) 打开网站可以看到有很多个数据&#xff0c;官…

洛谷——【数据结构1-2】二叉树

文章目录 题目【深基16.例1】淘汰赛题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1基本思路&#xff1a;代码 【深基16.例3】二叉树深度题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1基本思路&#xff1a;代码 [USACO3.4] 美国血统 American Heritage题目描…

小城交通大转型!苏州金龙助力杭州建德公交开新格局

新安江畔&#xff0c;密林丛生&#xff0c;一辆辆绿色巴士穿梭而行&#xff0c;杭州市首款纯电动无站立位公交车正在试运行中。 12月19日&#xff0c;杭州建德&#xff0c;23辆苏州金龙海格牌6米无站立位新能源纯电动公交车正式交付建德市公共交通运输有限公司。自此&#xff…

【AI】使用阿里云免费服务器搭建Langchain-Chatchat本地知识库

书接上文&#xff0c;由于家境贫寒的原因&#xff0c;导致我本地的GPU资源无法满足搭建Langchain-Chatchat本地知识库的需求&#xff0c;具体可以看一下这篇文章&#xff0c;于是我只能另辟蹊径&#xff0c;考虑一下能不能白嫖一下云服务器资源&#xff0c;于是去找网上找&…

2023航天推进理论基础考试划重点(W老师)绪论固体推进剂

1、推进系统的分类&#xff1a; 按工作原理分&#xff0c; 直接反作用发动机(喷气发动机) 火箭发动机、组合发动机、冲压发动机、涡轮喷气发动机、涡轮风扇发动机 间接反作用发动机 活塞式发动机、涡轮螺旋桨发动机、涡轮轴发动机、航空电动机 2、后面不细讲的火箭发动机要…

Adobe软件打开后设置默认页面方式和默认鼠标方式

PDF文件打开后是默认显示&#xff0c;与显示器比例不协调&#xff0c;或大或小&#xff0c;总是需要手动调节阅读方式&#xff0c;解决方法如下&#xff1a; Adobe软件中可以设置默认页面方式&#xff0c;具体步骤如下&#xff1a; 编辑 (Edit)-首选项(Preferences)-辅助工具…

车牌识别系统的设计matlab图像处理

wx供重浩&#xff1a;创享日记 对话框发送&#xff1a;车牌23 获取完整论文报告源码源程序文件 一、 摘要 随着公路逐渐普及&#xff0c;我国的公路交通事业发展迅速&#xff0c;所以人工管理方式已经不能满着实际的需要&#xff0c;微电子、通信和计算机技术在交通领域的应用…

2024年最新Python爬虫入门『最强教程』新鲜出炉!

近年来&#xff0c;大数据成为业界与学术界最火热的话题之一&#xff0c;数据已经成为每个公司极为重要的资产。互联网大量的公开数据为个人和公司提供了以往想象不到的可以获取的数据量。而掌握网络爬虫技术可以帮助你获取这些有用的公开数据集。 爬虫能干什么呢&#xff1f;一…

【强化学习】PPO:近端策略优化算法

近端策略优化算法 《Proximal Policy Optimization Algorithms》 论文地址&#xff1a;https://arxiv.org/pdf/1707.06347.pdf 一、 置信域方法(Trust Region Methods) ​ 设 π θ o l d \pi_{\theta_{old}} πθold​​是先前参数为 θ o l d \theta_{old} θold​的策略网…

5个适合初学者的初级网络安全工作

前言&#xff1a; 网络安全涉及保护计算机系统、网络和数据免受未经授权的访问、破坏和盗窃 - 防止数字活动和数据访问的中断 - 同时也保护用户的资产和隐私。鉴于公共事业、医疗保健、金融以及联邦政府等行业的网络犯罪攻击不断升级&#xff0c;对网络专业人员的需求很高&…

三级安全教育二维码怎么生成

三级安全教育是工人进场上岗前必备的过程&#xff0c;也是施工项目中非常重要的一项工作&#xff0c;我们要合理规范地进行安全教育培训工作&#xff0c;提升真实性和可靠性&#xff0c;保障工人的安全到位。 1、将三级安全教育制作成二维码,放在施工现场等位置,工人可以随时随…

行人重识别数据集-统一为market1501数据集进行多数据集联合训练

一、前言 常用的数据集&#xff1a; 数据集下载链接&#xff1a;https://kaiyangzhou.github.io/deep-person-reid/datasets.html https://kaiyangzhou.github.io/deep-person-reid/datasets.html#sensereid-sensereid 二、数据集合并 第一步&#xff1a;market1501的数据集…

【史上最小白】Bert:双向 Transformer 编码器

Bert&#xff1a;双向 Transformer 编码器 Bert&#xff1a;论洞察语境&#xff0c;GPT 不如我深刻&#xff1b;论理解含义&#xff0c;ELMo 不如我全面输入阶段词嵌入&#xff1a;把词语转换为向量第一个预训练 Masked&#xff1a;学习语言的深层次理解尝试 1&#xff1a;预测…