1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- // Copyright (C) 2015 The Syncthing Authors.
- //
- // This Source Code Form is subject to the terms of the Mozilla Public
- // License, v. 2.0. If a copy of the MPL was not distributed with this file,
- // You can obtain one at https://mozilla.org/MPL/2.0/.
- package main
- import (
- "bytes"
- "crypto/md5"
- "flag"
- "fmt"
- "io"
- "os"
- "time"
- )
- func getmd5(filePath string) ([]byte, error) {
- var result []byte
- file, err := os.Open(filePath)
- if err != nil {
- return result, err
- }
- defer file.Close()
- hash := md5.New()
- if _, err := io.Copy(hash, file); err != nil {
- return result, err
- }
- return hash.Sum(result), nil
- }
- func main() {
- period := flag.Duration("period", 200*time.Millisecond, "Sleep period between checks")
- flag.Parse()
- file := flag.Arg(0)
- if file == "" {
- fmt.Println("Expects a path as an argument")
- return
- }
- exists := true
- size := int64(0)
- mtime := time.Time{}
- hash := []byte{}
- for {
- time.Sleep(*period)
- newExists := true
- fi, err := os.Stat(file)
- if err != nil && os.IsNotExist(err) {
- newExists = false
- } else if err != nil {
- fmt.Println("stat:", err)
- return
- }
- if newExists != exists {
- exists = newExists
- if !newExists {
- fmt.Println(file, "does not exist")
- } else {
- fmt.Println(file, "appeared")
- }
- }
- if !exists {
- size = 0
- mtime = time.Time{}
- hash = []byte{}
- continue
- }
- if fi.IsDir() {
- fmt.Println(file, "is directory")
- return
- }
- newSize := fi.Size()
- newMtime := fi.ModTime()
- newHash, err := getmd5(file)
- if err != nil {
- fmt.Println("getmd5:", err)
- }
- if newSize != size || newMtime != mtime || !bytes.Equal(newHash, hash) {
- fmt.Println(file, "Size:", newSize, "Mtime:", newMtime, "Hash:", fmt.Sprintf("%x", newHash))
- hash = newHash
- size = newSize
- mtime = newMtime
- }
- }
- }
|