基于golang实现简单的文件监控

news2024/11/15 5:21:16

基于golang实现简单的文件监控

package main

import (
	"log"
	"syscall"
	"unsafe"
)

type FileNotifyInformation struct {
	Action uint32
	Name   string
}

func Fswatch(path string) (chan FileNotifyInformation, error) {
	handle, err := syscall.CreateFile(
		syscall.StringToUTF16Ptr(path),
		0x0001,
		syscall.FILE_SHARE_READ|syscall.FILE_SHARE_WRITE|syscall.FILE_SHARE_DELETE,
		nil,
		syscall.OPEN_EXISTING,
		syscall.FILE_FLAG_BACKUP_SEMANTICS,
		0,
	)
	if err != nil {
		return nil, err
	}

	c := make(chan FileNotifyInformation, 4)
	go func() {
		defer syscall.CloseHandle(handle)
		defer close(c)
		buflen := 1024
		buf := make([]byte, buflen)
		for {
			err := syscall.ReadDirectoryChanges(
				handle,
				&buf[0],
				uint32(buflen),
				true,
				syscall.FILE_NOTIFY_CHANGE_FILE_NAME|
					syscall.FILE_NOTIFY_CHANGE_DIR_NAME|
					syscall.FILE_NOTIFY_CHANGE_ATTRIBUTES|
					syscall.FILE_NOTIFY_CHANGE_SIZE|
					syscall.FILE_NOTIFY_CHANGE_LAST_WRITE,
				nil,
				&syscall.Overlapped{},
				0,
			)
			if err != nil {
				break
			}

			var offset uint32
			for {
				raw := (*syscall.FileNotifyInformation)(unsafe.Pointer(&buf[offset]))
				buf := (*[syscall.MAX_PATH]uint16)(unsafe.Pointer(&raw.FileName))
				name := syscall.UTF16ToString(buf[:raw.FileNameLength/2])
				info := FileNotifyInformation{
					Action: raw.Action,
					Name:   name,
				}
				c <- info
				if raw.NextEntryOffset == 0 {
					break
				}
				offset += raw.NextEntryOffset
				if offset >= 1024 {
					break
				}
			}
		}
	}()
	return c, nil
}

func main() {
	c, err := Fswatch("E:\\company")
	if err != nil {
		log.Fatalln(err)
	}
	for info := range c {
		switch info.Action {
		case 1:
			log.Println("Create", info.Name)
		case 2:
			log.Println("Delete", info.Name)
		case 3:
			log.Println("Update", info.Name)
		case 4:
			log.Println("RenameFrom", info.Name)
		case 5:
			log.Println("RenameTo", info.Name)
		}

	}
}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vscode中暂存块功能不能用了

vscode中暂存文件修改可以按每一处暂存&#xff0c;而不用一次暂存整个文件的修改&#xff0c;今天发现这个功能不能用了&#xff0c;不知道啥原因&#xff0c;记录一下。

华晨宇火星演唱会三登鸟巢 升级国风四面台引期待

2024华晨宇火星演唱会北京站即将于9月7日、9月8日在鸟巢举办&#xff0c;今年华晨宇将再度带着四面台回归鸟巢&#xff0c;升级后的舞台将融入国风元素&#xff0c;为歌迷带来一场前所未有的视听盛宴。这将是他第三次踏足鸟巢的舞台&#xff0c;更是他音乐旅程的里程碑。 2018年…

性能测试经典案例解析——政务查询系统

各位好&#xff0c;我是 道普云 一站式云测试SaaS平台。一个在软件测试道路上不断折腾十余年的萌新。 欢迎关注我的主页 道普云 文章内容具有一定门槛&#xff0c;建议先赞再收藏慢慢学习&#xff0c;有不懂的问题欢迎私聊我。 希望这篇文章对想提高软件测试水平的你有所帮…

【最新综述】基于机器学习的超声焊接缺陷无损检测

Machine learning for ultrasonic nondestructive examination of welding defects: A systematic review ABSTRACT 近年来&#xff0c;机器学习&#xff08;ML&#xff09;在无损检测&#xff08;NDE&#xff09;数据自动分析中的应用大幅增加。其中一个值得关注的应用是使用…

JS_阿里云oss视频上传后,如何获取视频封面

当您需要获取视频封面、提取视频关键帧图像进行视频编辑&#xff0c;或者提取视频中特定场景帧图像用于视频监控等时&#xff0c;可以将视频上传至OSS存储空间&#xff0c;然后通过本文所示方法进行视频截帧。 使用示例 本文示例使用的Bucket为杭州地域名为oss-console-img-de…

基于WhatsApp打造高效的CRM系统

背景 在 2023 年的统计数据中&#xff0c;WhatsApp 成为了印尼最常用的社交媒体&#xff0c;拥有高达 2.2 亿的用户量&#xff0c;占据印尼互联网人群的 90%之多。 WhatsApp 开发的 WhatsApp Business API 为企业开辟了一条与客户进行大规模、高效且合规沟通的崭新途径。它使…

美联储降息在即:加密市场风云再起,机遇与挑战并存

随着全球金融市场日益与加密货币市场的波动紧密相连&#xff0c;美联储的货币政策调整正成为加密市场的重要风向标。今年以来&#xff0c;比特币等主流加密货币反复跟随全球市场震荡&#xff0c;宏观经济指标对加密市场的影响愈加显著。尤其是美国联邦基金利率的变动&#xff0…

【QA】软件产品在确定使用期限时应关注哪些问题?

版权说明&#xff1a;本文来源【国家药品监督管理局】&#xff0c;如果您认为我们的文中描述与事实不符或有侵权行为&#xff0c;请及时联系我们。感谢您的关注。

2025届必备:如何打造Java SpringBoot大型超市数据处理系统,提升管理效率,最新攻略!

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

生信软件33 - Wgsim生成双端(PE) fastq模拟数据

1. Wgsim&#xff08;Whole genome simulation&#xff09;简介 wgsim是可用于高通量数据模拟的软件&#xff0c;可以模拟出illumina测序数据&#xff0c;并且可以自由调整测序reads的读长&#xff0c;插入片段大小以及错误率等&#xff0c; 是开发BWA等大牛Li heng编写的基因…

Windows bat脚本学习九(srec_cat)

一、简介 srec_cat是一个在嵌入式开发中&#xff0c;使用非常频繁的软件&#xff0c;这里做个常用功能的介绍。 二、常用参数 文件类型 在使用srec_cat指令时&#xff0c;在输入文件和输出文件时&#xff0c;要指明文件的类型&#xff0c;如&#xff1a; input.hex -intel …

木舟0基础学习Java的第二十六天(JavaWeb)

设置响应头 resp.setHeader("key","nihao");//推荐使用英文 中文会乱码 案例&#xff1a;模拟登录 jdbc.properties driverClasscom.mysql.jdbc.Driver urljdbc:mysql://localhost:3306/test?verifyServerCertificatefalse&useSSLfalse nameroot p…

Qt:玩转QPainter后转之太极图(步骤详细、包含源码)

前言 简单了解了QPainter之后还是要做两个小例子练一练&#xff0c;不实际去做&#xff0c;只看看函数是没啥太大提升的&#xff0c;这里就简单画一个太极图。 正文 我们都知道太极分为阴阳鱼两部分&#xff0c;阴鱼(黑色)有个白色鱼眼&#xff0c;阳鱼(白色)有个黑色鱼眼&am…

Notes,无代码应用开发王者归来!

大家好&#xff0c;才是真的好。 连续一个星期都在讲HCL Notes Domino 14.5 EAP1&#xff0c;大家是不是已经感到疲惫了&#xff1f;和大家一样&#xff0c;我并没有。 因此&#xff0c;看了一下9月4号晚上的HCL Notes Domino 14.5 EAP1在线广播回顾&#xff0c;发现了几个大…

模拟RabbitMQ实现消息队列【项目】

文章目录 1. 项目介绍什么是RabbitMQ&#xff1f; 2. 开发环境3. 技术选型3.1ProtoBuf使用介绍&#xff1a;3.2 Muduo库3.3 SQLite3什么是SQLIte&#xff1f;为什么要用SQLite&#xff1f; 3.4 Gtest什么是Gtest 4. 需求分析4.1 核心概念4.2 核心API4.3 交换机类型4.4 持久化4.…

UVa1389/LA3709 Hard Life

UVa1389/LA3709 Hard Life 题目链接题意输入格式输出格式 分析AC 代码 题目链接 本题是2006年icpc欧洲区域赛东北欧赛区的H题 题意 约翰是一家公司的CEO。公司的股东决定让他的儿子斯科特成为公司的经理。约翰十分担心&#xff0c;儿子会因为在经理岗位上表现优异而威胁到他CE…

IPv4地址学习

今天学习了IPv4&#xff0c;做下学习笔记&#xff1a; 什么是IPv4&#xff1f; IPv4地址是网络层地址&#xff0c;用于标识网络中的每个节点。 什么是子网&#xff1f;什么是主类子网划分&#xff1f; 我们将IP地址划分为网络位和主机位 一个地址为192.168.1.2/24&#xff…

【HTML】置换元素(替换元素)

● 它的内容不是由元素的标签内的内容决定的,而是由元素的属性决定的 ● 可以通过CSS设置宽度和高度。 常见的置换元素主要包括以下几种: <img> 元素:用于嵌入图像,通过 src 属性指定图像的路径。例如:<img src="example.jpg" alt="示例图片&quo…

场景感知技术带您重塑未来生活的新篇章

在科技日新月异的今天&#xff0c;场景感知技术正以前所未有的速度渗透到我们生活的方方面面&#xff0c;成为连接物理世界与数字世界的桥梁&#xff0c;重塑着人类的认知方式与生活体验。这项技术通过综合运用传感器、大数据分析、人工智能等前沿科技&#xff0c;实现对周围环…

C++多态 学习笔记(上)

本文涉及的指针都是 4bytes 。 如果要其他平台下&#xff0c;部分代码需要改动。比如&#xff1a;如果是 x64 程序&#xff0c;则需要考虑指针是 8bytes 问题 等等。 什么是多态&#xff1f; 举个例子&#xff1a;比如 买票这个行为 &#xff0c;当 普通人 买票时&#xff0c;…