gpt4 book ai didi

recursion - Golang File/Directory Walker 多次添加文件

转载 作者:IT王子 更新时间:2023-10-29 02:13:23 26 4
gpt4 key购买 nike

所以我使用 filepath.Walk 函数递归地监视文件中的更改。 fsnotify 不能开箱即用递归。我设置了一个 Goroutine 来监视变化,然后我在 Walk() 函数中添加了观察者的路径。

func (w Watch) walkDirectories(fp string) {
error := filepath.Walk(fp, func(path string, info os.FileInfo, err error) error {
// skip files
if info == nil {
log.Fatalf("wrong watcher package: %s", path)
}
if !info.IsDir() {
return nil
}
if len(path) > 1 && strings.HasPrefix(filepath.Base(path), ".") {
return filepath.SkipDir
}
log.Println("filepath: ", filepath)
w.W.Add(path)
return err
})
log.Println("error: ", error)
}

我有一个包含 Watcher 的自定义 Struct,因此我可以轻松地为其添加要监视的路径。您可以在此处看到它的使用:w.W.Add(path)。这一切都很好,除了顶级目录中的文件似乎被添加到观察者两次,或者至少我的假设是“与顶级目录级别下的目录级别一样多”。我的目录结构是这样的:

.
├── README.md
├── languages.go
├── languages.json
├── librarymonitor.go
├── telemetryClient
└── testfiles
├── test.go
├── test.c
├── test.java

如果我更改了 testfiles 目录中的文件,我会从观察者那里收到一个“通知”。如果我更改根目录中的一个文件,我会得到两个。任何人都可以阐明这一点吗?
谢谢

最佳答案

检查您的主要代码,这工作正常,(尝试 The Go Playground ):

package main

import (
"fmt"
"os"
"path/filepath"
"reflect"
"time"
)

func main() {
rootDir := ".."
pattern := "*"
dirs, err := GetDirectories(rootDir, pattern)
if err != nil {
panic(err)
}
ticker := time.NewTicker(1 * time.Second)
for i := 1; i < 10; i++ {
<-ticker.C
dirs2, err := GetDirectories(rootDir, pattern)
//fmt.Println(dirs2)
if err != nil {
panic(err)
}
if !reflect.DeepEqual(dirs, dirs2) {
fmt.Println("Dir Changed: ", len(dirs), len(dirs2))
dirs = dirs2
}
}
ticker.Stop()
fmt.Println("Done")
}

// Returns the names of the subdirectories (including their paths)
// that match the specified search pattern in the specified directory.
func GetDirectories(root, pattern string) ([]string, error) {
dirs := make([]string, 0, 144)
return dirs, filepath.Walk(root, func(path string, fi os.FileInfo, err error) error {
if !fi.IsDir() {
return nil
}
matched, err := filepath.Match(pattern, fi.Name())
if err != nil {
return err
}
if !matched {
return nil
}
dirs = append(dirs, path)
return nil
})
}

示例输出(带有一个新目录):

Dir Changed:  16 17
Done

关于recursion - Golang File/Directory Walker 多次添加文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39427199/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com