使用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)。
预先感谢任何回复:)
答案 0 :(得分:4)
在类Unix操作系统上,一旦打开文件,它就不再与名称绑定。您获得的文件描述符仅与您打开的文件的inode相关联。文件的所有元数据都与inode相关联。没有简单的方法可以从inode获取文件的名称,因此您想要的是不可能的,除非您使用的操作系统提供了一种特殊的方法来执行此操作。
另外:您想要观察哪个文件名?文件可以有多个名称或根本没有名称(例如典型的临时文件)。
我认为你唯一能做的就是:
然而,这不会给你新的文件名。这样的事情是不可能做到的。
答案 1 :(得分:2)
唉,一般来说,查找打开文件的名称是一个相当困难的问题。
所有file.Name()
都这样做(see the docs)
// Name returns the name of the file as presented to Open.
func (f *File) Name() string { return f.name }
您可能想要查看此问题以获取一些想法:Getting Filename from file descriptor in C。答案中有适用于Linux,Windows和Mac的解决方案。