diff --git a/go.mod b/go.mod index 0b86134..b32dffd 100644 --- a/go.mod +++ b/go.mod @@ -10,10 +10,12 @@ require ( require ( github.com/PuerkitoBio/goquery v1.8.0 // indirect github.com/andybalholm/cascadia v1.3.1 // indirect + github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/mmcdole/goxpp v1.1.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect golang.org/x/net v0.4.0 // indirect + golang.org/x/sys v0.3.0 // indirect golang.org/x/text v0.5.0 // indirect ) diff --git a/go.sum b/go.sum index 9e53f9c..34e8b8d 100644 --- a/go.sum +++ b/go.sum @@ -5,6 +5,8 @@ github.com/andybalholm/cascadia v1.3.1/go.mod h1:R4bJ1UQfqADjvDa4P6HZHLh/3OxWWEq github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= +github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= @@ -29,6 +31,9 @@ golang.org/x/net v0.4.0 h1:Q5QPcMlvfxFTAPV0+07Xz/MpK9NTXu2VDUuy0FeMfaU= golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.3.0 h1:w8ZOecv6NaNa/zC8944JTU3vz4u6Lagfk4RPQxv92NQ= +golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.5.0 h1:OLmvp0KP+FVG99Ct/qFiL/Fhk4zp4QQnZ7b2U+5piUM= diff --git a/utils/feed.go b/utils/feed.go index 9a22f1b..49e68b7 100644 --- a/utils/feed.go +++ b/utils/feed.go @@ -2,10 +2,11 @@ package utils import ( "log" - "os" "rss-reader/globals" "rss-reader/models" "time" + + "github.com/fsnotify/fsnotify" ) func UpdateFeeds() { @@ -70,33 +71,47 @@ func GetFeeds() []models.Feed { } func WatchConfigFileChanges(filePath string) { - // 获取初始文件信息 - initialFileInfo, err := os.Stat(filePath) + // 创建一个新的监控器 + watcher, err := fsnotify.NewWatcher() if err != nil { - log.Println("无法获取文件信息:", err) - return + log.Fatal(err) + } + defer watcher.Close() + + // 添加要监控的文件 + err = watcher.Add(filePath) + if err != nil { + log.Fatal(err) } - for { - // 每隔一段时间检查文件是否有变化 - time.Sleep(7 * time.Second) - - // 获取最新的文件信息 - currentFileInfo, err := os.Stat(filePath) - if err != nil { - log.Println("无法获取文件信息:", err) - return - } - - // 检查文件的修改时间是否有变化 - if currentFileInfo.ModTime() != initialFileInfo.ModTime() { - log.Println("文件已修改") - initialFileInfo = currentFileInfo - globals.Init() - formattedTime := time.Now().Format("2006-01-02 15:04:05") - for _, url := range globals.RssUrls.Values { - go UpdateFeed(url, formattedTime) + // 启动一个 goroutine 来处理文件变化事件 + go func() { + for { + time.Sleep(7 * time.Second) + select { + case event, ok := <-watcher.Events: + if !ok { + log.Println("通道关闭1") + return + } + if event.Op&fsnotify.Write == fsnotify.Write { + log.Println("文件已修改") + globals.Init() + formattedTime := time.Now().Format("2006-01-02 15:04:05") + for _, url := range globals.RssUrls.Values { + go UpdateFeed(url, formattedTime) + } + } + case err, ok := <-watcher.Errors: + if !ok { + log.Println("通道关闭2") + return + } + log.Println("错误:", err) + return } } - } + }() + + select {} }