为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
弑天下 2021-06-02 17:43:06
使用 Go,我正在编写一个小实用程序,部分需要注意打开文件的文件名是否更改。下面的代码说明了我尝试的方法:package mainimport "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 回答

?
繁星淼淼

TA贡献1775条经验 获得超11个赞

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

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

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

  • 打开文件,记住文件名

  • 定期对文件名调用 Stat 以查看 inode 是否匹配

  • 如果 inode 不同,则您的文件已被移动

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


查看完整回答
反对 回复 2021-06-28
  • 2 回答
  • 0 关注
  • 290 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信