Djam36
@Djam36

Как реализовать правильно на GO функционал отслеживания изменений в файле?

Идея, читать файл после изменений, эти изменение передавать в другую функцию
Имею Watcher это go файл с одной функцией, которая отслеживает эти изменения ( то что в файл записались новые данные)

func MusicFile()   {
	watcher, err := fsnotify.NewWatcher()
	if err != nil {
		log.Fatal(err)
	}
	defer watcher.Close()
	done := make(chan bool)
	go func() {
		fmt.Println("start")
		for {
			select {
			case event := <-watcher.Events:
				if event.Op&fsnotify.Write == fsnotify.Write {
					Parser.ParseMusicFile() -- Вызываю функцию парсинга если в канал записались данные о том что файл перезаписан 


			}
			case err := <-watcher.Errors:
				fmt.Println("error:", err)
			}
	}
	}()
	err = watcher.Add(Parser.ParsConfig().Directory)
	if err != nil {
		log.Fatal(err)
	}
	<-done

	}


Имею парсер файла

func ParseMusicFile() *MusicFile {
	reSong := regexp.MustCompile(`(?m)(^[^|]+(?:|))`)
	reArtist := regexp.MustCompile(`(?m)\|(.*)`)
	file, err := os.Open(ParsConfig().Directory)
	if err != nil {
		panic(err)
	}
	defer file.Close()
	MusicFile := &MusicFile{}
	scanner := bufio.NewScanner(file)
	for scanner.Scan() {
		if reSong.MatchString(scanner.Text()) { // Тут записывается результат найдено значение по регулярке или нет
			//*MusicFile.Song := reSong.MatchString(scanner.Text())
			MusicFile.Song = reSong.FindStringSubmatch(scanner.Text())[1]
		}else {
			MusicFile.Song = "null"
		}
		if reArtist.MatchString(scanner.Text()) { //Тут записывается результат найдено значение по регулярке или нет
			MusicFile.Artist = reArtist.FindStringSubmatch(scanner.Text())[1]
		}else {
			MusicFile.Artist = "null"
		}
	}

	return MusicFile
}


Парсер возвращает структуру

type MusicFile struct {
	Artist string
	Song   string
}


Смысл какой, при запуске Watcher процесса он висит и читает изменения в файле, изменения туда попадают с помощью стороннего софта, как мне правильно организовать постоянную "отдачу" изменений с помощью Watcher функции

Поставьте на путь истинный, я так полагаю изменения с помощью парсера так же нужно принимать через канал? и передавать уже поинтер на этот канал туда куда надо?
  • Вопрос задан
  • 784 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы