Detecting File Changes in Go
Question:
How can I detect when a file changes using the Go programming language? Is there a way to emulate Linux's fcntl() functionality, which can notify when a specific file undergoes changes?
Answer:
While the fcntl() function is not available in Go, there are other techniques you can use to achieve file change detection.
Cross-Platform Method:
This method involves polling the file for changes at regular intervals:
func watchFile(filePath string) error { initialStat, err := os.Stat(filePath) if err != nil { return err } for { stat, err := os.Stat(filePath) if err != nil { return err } if stat.Size() != initialStat.Size() || stat.ModTime() != initialStat.ModTime() { break } time.Sleep(1 * time.Second) } return nil }
This function repeatedly checks the file's size and modified time, and returns when a change is detected.
Usage Example:
doneChan := make(chan bool) go func(doneChan chan bool) { defer func() { doneChan <- true }() err := watchFile("/path/to/file") if err != nil { fmt.Println(err) } fmt.Println("File has been changed") }(doneChan) <-doneChan
This example demonstrates how to use the watchFile function to detect file changes and notify the main routine via a channel.
Note:
This cross-platform method is not as efficient as a native system call but provides a simple and portable way to track file changes. It may be sufficient for certain use cases.
The above is the detailed content of How Can I Detect File Changes in Go?. For more information, please follow other related articles on the PHP Chinese website!