当前位置: 首页 > article >正文

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

	}
}

在这里插入图片描述


http://www.kler.cn/a/293813.html

相关文章:

  • Mit6.S081-实验环境搭建
  • NCC前端调用查询弹框
  • 重新认识HTTPS
  • 将大型语言模型(如GPT-4)微调用于文本续写任务
  • ODOO学习笔记(1):ODOO的SWOT分析和技术优势是什么?
  • 低功耗WTK6900P语音ic方案助力电子烟技术革新 打造个性化吸烟体验
  • 【Python百日进阶-Web开发-音频】Day705 - 音频加载 librosa.load / librosa.stream
  • 《系统架构设计师教程(第2版)》第17章-通信系统架构设计理论与实践-02-广域网网络架构
  • HTML和HTML5有什么区别
  • 畅捷通如何远程访问
  • 主流的3D模型格式有什么区别?
  • 数据分析有哪些流程?
  • 【iOS】Runtime
  • 以低代码技术加速推动企业数字创新
  • 一款可以替代Notepad++的免费高级文本编辑器
  • 数字人模型像素流送实时渲染网页手机平板用语音交互
  • 363_C++_配合360_负责读取和处理录像数据RecordReader类
  • OrangePi AIpro 香橙派 昇腾 Ascend 开发系列
  • AIOT边缘计算机助力智慧储能,开启能源管理新时代
  • 【秋招笔试】9.06去哪儿秋招改编题(第一套)-三语言题解
  • 修改打包后element-ui的字体文件名;JS文件名;CSS文件名
  • 启动.cmd文件一闪而过,看不到报错信息
  • (二)十分简易快速 自己训练样本 opencv级联lbp分类器 车牌识别
  • 策略模式的小记
  • GS-SLAM论文阅读笔记--LoopSplat
  • 智能新纪元:GPT-Next引领的AI革命及其跨领域应用