新聞中心
?gfsnotify?能監(jiān)控指定文件/目錄的改變,如文件的增加、刪除、修改、重命名等操作。

鳳臺(tái)網(wǎng)站建設(shè)公司成都創(chuàng)新互聯(lián),鳳臺(tái)網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為鳳臺(tái)上千多家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站制作要多少錢(qián),請(qǐng)找那個(gè)售后服務(wù)好的鳳臺(tái)做網(wǎng)站的公司定做!
使用方式:
import "github.com/GOgf/gf/v2/os/gfsnotify"
接口文檔:
https://pkg.go.dev/github.com/gogf/gf/v2/os/gfsnotify
推薦使用?gfsnotify?模塊提供的?Add?和?Remove?模塊方法,用于添加監(jiān)控和取消監(jiān)控。推薦原因見(jiàn)隨后章節(jié)說(shuō)明。
此外也可能通過(guò)?New?方法創(chuàng)建一個(gè)監(jiān)控管理對(duì)象之后再進(jìn)行監(jiān)控管理。其中,添加監(jiān)控的時(shí)候需要給定觸發(fā)監(jiān)控時(shí)的回調(diào)函數(shù),參數(shù)類(lèi)型為?*gfsnotify.Event?對(duì)象指針。
添加監(jiān)聽(tīng)
package main
import (
"github.com/gogf/gf/v2/os/gfsnotify"
"github.com/gogf/gf/v2/os/glog"
)
func main() {
// /home/john/temp 是一個(gè)目錄,當(dāng)然也可以指定文件
path := "/home/john/temp"
_, err := gfsnotify.Add(path, func(event *gfsnotify.Event) {
if event.IsCreate() {
glog.Println("創(chuàng)建文件 : ", event.Path)
}
if event.IsWrite() {
glog.Println("寫(xiě)入文件 : ", event.Path)
}
if event.IsRemove() {
glog.Println("刪除文件 : ", event.Path)
}
if event.IsRename() {
glog.Println("重命名文件 : ", event.Path)
}
if event.IsChmod() {
glog.Println("修改權(quán)限 : ", event.Path)
}
glog.Println(event)
})
// 移除對(duì)該path的監(jiān)聽(tīng)
// gfsnotify.Remove(path)
if err != nil {
glog.Fatalln(err)
} else {
select {}
}
}
其中?/home/john?參數(shù)為一個(gè)目錄,?gfsnotify.Add?方法默認(rèn)為遞歸監(jiān)控,也就是說(shuō)當(dāng)目錄下的文件(包括子目錄下的文件)發(fā)生變化時(shí),也會(huì)收到文件監(jiān)控信息回調(diào)。
當(dāng)我們?cè)?/home/john?目錄下創(chuàng)建/刪除/修改文件時(shí),可以看到?gfsnotify?監(jiān)控到了文件的修改并輸出了對(duì)應(yīng)的事件信息。
移除監(jiān)聽(tīng)
移除監(jiān)聽(tīng)我們可以使用?Remove?方法,會(huì)移除對(duì)整個(gè)文件/目錄的監(jiān)聽(tīng)。
當(dāng)對(duì)同一個(gè)文件/目錄存在多個(gè)監(jiān)聽(tīng)回調(diào)時(shí),我們可以通過(guò)?RemoveCallback?方法移除指定的回調(diào)。方法參數(shù)?callbackId?是在添加監(jiān)聽(tīng)時(shí)返回的?Callback?對(duì)象的唯一ID。
使用示例1:
package main
import (
"github.com/gogf/gf/v2/os/gfsnotify"
"github.com/gogf/gf/v2/os/glog"
"github.com/gogf/gf/v2/os/gtimer"
"time"
)
func main() {
c1, err := gfsnotify.Add("/home/john/temp/log", func(event *gfsnotify.Event) {
glog.Println("callback1")
})
if err != nil {
panic(err)
}
c2, err := gfsnotify.Add("/home/john/temp/log", func(event *gfsnotify.Event) {
glog.Println("callback2")
})
if err != nil {
panic(err)
}
// 5秒后移除c1的回調(diào)函數(shù)注冊(cè),僅剩c2
gtimer.SetTimeout(5*time.Second, func() {
gfsnotify.RemoveCallback(c1.Id)
glog.Println("remove callback c1")
})
// 10秒后移除c2的回調(diào)函數(shù)注冊(cè),所有的回調(diào)都移除,不再有任何打印信息輸出
gtimer.SetTimeout(10*time.Second, func() {
gfsnotify.RemoveCallback(c2.Id)
glog.Println("remove callback c2")
})
select {}
}
使用示例2:
package main
import (
"github.com/gogf/gf/v2/os/gfsnotify"
"github.com/gogf/gf/v2/os/glog"
"github.com/gogf/gf/v2/os/gtimer"
"time"
)
func main() {
callback, err := gfsnotify.Add("/home/john/temp", func(event *gfsnotify.Event) {
glog.Println("callback")
})
if err != nil {
panic(err)
}
// 在此期間創(chuàng)建文件、目錄、修改文件、刪除文件
// 20秒后移除回調(diào)函數(shù)注冊(cè),所有的回調(diào)都移除,不再有任何打印信息輸出
gtimer.SetTimeout(20*time.Second, func() {
gfsnotify.RemoveCallback(callback.Id)
glog.Println("remove callback")
})
select {}
}
fs.inotify.max_user_instances與fs.inotify.max_user_watches
在?*nix?系統(tǒng)下,?gfsnotify?模塊使用的是系統(tǒng)的?inotify?特性來(lái)實(shí)現(xiàn)的文件/目錄監(jiān)控,因此該功能在使用時(shí)會(huì)受到系統(tǒng)的兩個(gè)內(nèi)核函數(shù)限制:
- ?
fs.inotify.max_user_instances?:表示當(dāng)前用戶(hù)可創(chuàng)建的?inotify?監(jiān)控實(shí)例數(shù)量,即?gfsnotify.New?方法創(chuàng)建的?Watcher?對(duì)象數(shù)量,一個(gè)?Watcher?對(duì)象對(duì)應(yīng)系統(tǒng)的一個(gè)?inotify?實(shí)例,系統(tǒng)默認(rèn)數(shù)量為:?128?; - ?
fs.inotify.max_user_watches?:表示一個(gè)?inotify?實(shí)例可添加的監(jiān)控文件隊(duì)列大小,往同一個(gè)?inotify?添加的監(jiān)控文件超過(guò)該數(shù)量限制則會(huì)失敗,并且會(huì)有系統(tǒng)錯(cuò)誤日志,系統(tǒng)默認(rèn)數(shù)量往往為:?8192?(有的系統(tǒng)該數(shù)值會(huì)比較大一些);
網(wǎng)站名稱(chēng):創(chuàng)新互聯(lián)GoFrame教程:GoFrame文件監(jiān)控-gfsnotify
轉(zhuǎn)載來(lái)源:http://www.dlmjj.cn/article/djdppjc.html


咨詢(xún)
建站咨詢(xún)
