Как обнаружить изменение имени файла открытого файла в 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.