如何检测Golang中打开文件的文件名更改

jsd*_*sdw 6 go

使用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)
    }
}
Run Code Online (Sandbox Code Playgroud)

这只是启动一个无限循环,运行file.Stat()以每5秒获取一次文件详细信息然后打印出名称.但是,尽管在运行时更改了文件名,但上述输出不会改变.

但是,替换details.Name()details.Size()注意到文件大小的更改.

这只是我的Go版本中的一个错误,还是我只是做错了?我无法在任何地方找到这样的问题.

我在Mac上运行它,使用Go版本1.1.1(darwin/amd64).

在此先感谢任何回复:)

fuz*_*fuz 5

在类 Unix 操作系统上,一旦打开文件,它就不再与名称绑定。您获得的文件描述符仅与您打开的文件的索引节点相关联。文件的所有元数据都与索引节点相关联。没有简单的方法可以从索引节点获取文件名,因此您想要的东西是不可能的,除非您使用的操作系统提供了特殊的方法来做到这一点。

另外:您想观察什么文件名?一个文件可以有多个名称或根本没有名称(例如典型的临时文件)。

我认为你唯一能做的就是:

  • 打开文件,记住文件名
  • 定期对文件名调用 Stat 以查看 inode 是否匹配
  • 如果 inode 不同,则您的文件已被移动

但是,这不会为您提供新的文件名。这样的事情是不可能便携完成的。