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

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

package mainimport ("fmt""os""path""path/filepath""syscall""time""unsafe"
)const MAX_PATH = 260type FILETIME struct {dwLowDateTime  uint32dwHighDateTime uint32
}type WIN32_FIND_DATAW struct {dwFileAttributes   uint32ftCreationTime     FILETIMEftLastAccessTime   FILETIMEftLastWriteTime    FILETIMEnFileSizeHigh      uint32nFileSizeLow       uint32dwReserved0        uint32dwReserved1        uint32cFileName          [MAX_PATH]uint16cAlternateFileName [14]uint16dwFileType         uint32dwCreatorType      uint32wFinderFlags       uint16FileName           string
}
type IndexEntry2 struct {Name stringPath stringSize uint64
}var (kernel32           = syscall.NewLazyDLL("Kernel32.dll")procFindFirstFileW = kernel32.NewProc("FindFirstFileW")procFindNextFileW  = kernel32.NewProc("FindNextFileW")procFindClose      = kernel32.NewProc("FindClose")
)type HANDLE uintptrconst (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_DATAWglobalPath := 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 pathdir := `E:\`fmt.Println(len(FindFileWin(dir)))// fmt.Println(len(FileWalk(dir)))fmt.Printf("共花费时间 %.3f seconds\n", time.Since(startTime).Seconds())
}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

千帆起航:探索百度智能云千帆AppBuilder在AI原生应用开发中的革新之路

千帆起航&#xff1a;探索百度千帆AppBuilder在AI原生应用开发中的革新之路 1.揭开帷幕&#xff0c;大模型第二次战役 自从 ChatGPT 横空出世后&#xff0c;一石激起千层浪&#xff0c;人工智能也正在从感知理解走向生成创造&#xff0c;这是一个关键里程碑。生成式大模型完成…

视觉学习(5) —— 绑定流程

1、前提 2、接收事件 绑定参数 3、规则列表的设置 &#xff08;1&#xff09;字节起止位置 0到1是两个字节 当输入值为整数1 &#xff08;2&#xff09;比较规则配置 大于 等于 小于 上升沿等等 而后是范围 值等于1到5之间都算满足条件 4、全局触发 以上的逻辑&#xff1a;当…

HBase基础知识(五):HBase 对接 Hadoop 的 MapReduce

通过 HBase 的相关 JavaAPI&#xff0c;我们可以实现伴随 HBase 操作的 MapReduce 过程&#xff0c;比如使用 MapReduce 将数据从本地文件系统导入到 HBase 的表中&#xff0c;比如我们从 HBase 中读取一些原 始数据后使用 MapReduce 做数据分析。 1 官方 HBase-MapReduce 1&am…

猫头虎分享2023年12月17日博客之星候选--领域赛道博主文章数据

猫头虎分享2023年12月17日博客之星候选–领域赛道博主文章数据 博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开…

浅谈Dubbo核心概念及架构流程

浅谈Dubbo核心概念及架构流程 前言重要概念1、SPI2、ServiceBean3、URL4、Invoker 整体流程1、架构图2、调用链路 笔者碎碎言&#xff0c;我们学习Dubbo应该学的是什么&#xff1f; 笔者是一名业务开发&#xff0c;认为一切目的都要为我们的目标服务&#xff0c;即日常工作有帮…

从零实现一套低代码(保姆级教程) --- 【5】实现组件和属性面板的交互

摘要 在上一篇中&#xff0c;我们简单实现了右侧属性面板。可以通过更改按钮文字&#xff0c;重新渲染Button组件。 目前来到了本系列的第五章&#xff0c;本篇主要是实现Button组件的全部属性配置。 如果你是第一次看本系列中的文章&#xff0c;建议可以先看一下第一节&…

【adb】电脑通过ADB向手机传输文件

具体步骤如下&#xff1a; Step1 下载ADB工具 下载最新版本的 ADB工具 !!! 注意&#xff1a;一定要是最新版本的ADB&#xff0c;否则很可能导致无法识别到手机。 将下载的ADB解压以后的文件如下图所示&#xff1a; Step2 添加环境变量 将 ADB的路径 D:\platformtools &…

YOLO算法改进7【中阶改进篇】:主干网络C3替换为轻量化网络MobileNetV3

解决问题&#xff1a;YOLOv5主干特征提取网络采用C3结构&#xff0c;带来较大的参数量&#xff0c;检测速度较慢&#xff0c;应用受限&#xff0c;在某些真实的应用场景如移动或者嵌入式设备&#xff0c;如此大而复杂的模型时难以被应用的。首先是模型过于庞大&#xff0c;面临…

MySQL运维实战(1.3)安装部署:源码编译安装

作者&#xff1a;俊达 引言 在大多数情况下&#xff0c;我们不需要自己编译MySQL源码&#xff0c;因为编译的MySQL和二进制包的内容基本一致。然而&#xff0c;有些特殊情况可能需要我们采用源码编译的方式安装MySQL&#xff1a; 安装非标准版本的MySQL&#xff1a;有些特殊…

轻松管理固定资产,易点易动固定资产管理系统为企业开启新篇章

在现代企业运营中&#xff0c;固定资产管理是一个不可忽视的关键环节。有效地管理和维护固定资产不仅可以提升企业运营效率&#xff0c;还能最大限度地发挥资产的价值。为了满足企业对固定资产管理的需求&#xff0c;我们推出了易点易动固定资产管理系统&#xff0c;一款功能强…

PyTorch官网demo解读——第一个神经网络(3)

上一篇&#xff1a;PyTorch官网demo解读——第一个神经网络&#xff08;2&#xff09;-CSDN博客 上一篇文章我们讲解了第一个神经网络的模型&#xff0c;这一篇我们来聊聊梯度下降。 大佬说梯度下降是深度学习的灵魂&#xff1b;梯度是损失函数&#xff08;代价函数&#xff…

labelme目标检测数据类型转换

1. labelme数据类型 LabelMe是一个开源的在线图像标注工具&#xff0c;旨在帮助用户创建和标记图像数据集。它提供了一个用户友好的界面&#xff0c;让用户可以直观地在图像上绘制标记框、多边形、线条等&#xff0c;以标识和注释图像中的对象或区域。 GitHub&#xff1a;http…