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

	}
}
相关推荐
luj_17687 小时前
残熵算法实时化三大瓶颈突破
c语言·开发语言·网络·经验分享·算法
不听话坏8 小时前
Ignition篇(下 一) 动态执行前的事情
开发语言·前端·javascript
mCell8 小时前
你以为短链接只是 Hash + 301/302?
后端·算法·架构
likeyi078 小时前
require 和 import的区别
开发语言·前端
咖啡八杯8 小时前
GoF设计模式——迭代器模式
java·后端·设计模式·迭代器模式
远离UE48 小时前
UE5 compute shader 原子加
开发语言·c++·ue5
C+-C资深大佬8 小时前
C++ 显式类型转换详解:static_cast、dynamic_cast、const_cast、reinterpret_cast
开发语言·c++
KaMeidebaby9 小时前
卡梅德生物技术快报|抗体亲和力成熟工业化调控新机制:差异性浆细胞增殖工艺优化思路
java·开发语言·人工智能·算法·机器学习·架构·spark
luj_176810 小时前
心形曲线轨迹控制三大关键技术
c语言·开发语言·c++·经验分享·算法
Mininglamp_271810 小时前
Claude Code 封禁中国开发者之后:本地 AI 编程工具的替代方案实测
开发语言·人工智能·windows·开源软件·ai-native