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

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

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)
		}

	}
}
相关推荐
卷无止境几秒前
手写 SQL 在 Tortoise ORM 里到底能派上什么用场
后端·python·fastapi
再吃一根胡萝卜3 分钟前
从 Docker 到 Kubernetes:微服务的“操作系统”长什么样?
后端
龙虾PRO3 分钟前
2026 DeepSeek Harness 部署完整教程:npx 一键启动至 Python SDK 全流程接入
开发语言·python
卷无止境4 分钟前
FastAPI、Tortoise ORM 与 PostgreSQL 三件套 是否好用呢?
后端·python·fastapi
程序员爱钓鱼11 分钟前
Rust Trait详解:定义共享行为与抽象接口
后端·面试·rust
再吃一根胡萝卜12 分钟前
分布式事务:从“强一致”到“最终一致”,我为什么在微服务里放弃了 2PC?
后端
再吃一根胡萝卜15 分钟前
从 Django 到 Spring Cloud:一个全栈开发者的微服务思考
后端
程序员爱钓鱼15 分钟前
Go 编程实战:切片 Slice——灵活的动态数据集合
后端·面试·go
小新讲网安2 小时前
WiFi安全攻防实战:WPA3新协议与传统破解技术全解析
开发语言·网络·安全·php·漏洞·nmap·漏洞检测
再吃一根胡萝卜7 小时前
微服务治理的“四大护法”:从 Django 视角理解 Spring Cloud 核心组件
后端