Как обнаружить изменение имени файла открытого файла в Golang
используя Go, я писал небольшую утилиту, которая частично должна заметить, изменяется ли имя файла открытого файла. Приведенный ниже код иллюстрирует подход, который я пробовал:
package main
import "os"
import "fmt"
import "time"
func main() {
path := "data.txt"
file, _ := os.Open(path)
for {
details, _ := file.Stat()
fmt.Println(details.Name())
time.Sleep(5 * time.Second)
}
}
Это просто начинает бесконечный цикл, работает file.Stat()
чтобы получить сведения о файле каждые 5 секунд, а затем распечатать имя. Однако, несмотря на изменение имени файла, как это работает, вывод выше не изменяется.
замена details.Name()
С details.Size()
однако замечает изменения в размер.
Это просто ошибка в моей версии Go, или я просто делаю что-то неправильно? Я нигде не могу найти упоминания о таком вопросе.
Я запускаю это на Mac, с Go версии 1.1.1 (darwin / amd64).
заранее спасибо за любые ответы :)
2 ответов
в Unix-подобных операционных системах, как только вы открываете файл, он больше не привязан к имени. Файловый дескриптор, который вы получаете, привязан только к индексу открываемого файла. Все метаданные файла связаны с индексом. Нет простого способа получить имя файла из индекса, поэтому то, что вы хотите, невозможно, за исключением случаев, когда операционная система, которую вы используете, предоставляет специальные средства для этого.
также: Какое имя вы хотите наблюдать? Файл может иметь несколько имена или вообще без имени (например, типичный временный файл).
единственное, что я думаю, что вы могли бы сделать это:
- откройте файл, запомните имя файла
- периодически вызывайте Stat по имени файла, чтобы узнать, соответствует ли индекс
- если индекс отличается, ваш файл был перемещен
однако это не дает вам нового имени файла. Такое невозможно сделать сносно.
увы, это достаточно сложная проблема, чтобы найти имя открытого файла в целом.
все file.Name()
делает это (посмотреть документы)
// Name returns the name of the file as presented to Open.
func (f *File) Name() string { return f.name }
вы можете проверить этот вопрос для некоторых идей:получение имени файла из файлового дескриптора в C. В ответах есть решения для Linux, Windows и Mac.