【问题标题】:Get file size given file descriptor in Go在 Go 中获取给定文件描述符的文件大小
【发布时间】:2019-01-04 21:02:34
【问题描述】:

如果给定路径,我会使用它来获取文件大小

file, _ := os.Open(path)
fi, _ := file.Stat()
fsuze := fi.Size()

但如果给定fd,我怎样才能获得文件大小? 在 C 中有这样的 Go 方法吗:

lseek(fd, 0, SEEK_END)

【问题讨论】:

  • 澄清一下,fd 是否表示整数文件描述符,就像 C 语言中的 open() 一样?
  • 是的。我通过调用 os.File.stat().Fd() 得到这个 fd
  • 是的,使用syscall.Fstat,基本上是fstat(2)。请注意,这当然不能移植到非 POSIX 平台。

标签: file go operating-system


【解决方案1】:

尝试让文件启动

fileInfo, err := file.Stat()
if err != nil {...
}
files fileInfo.Size())

【讨论】:

    【解决方案2】:

    您使用os.NewFile 函数从文件描述符创建一个新的*os.File

    您可以使用 Seek 以与 C 中完全相同的方式进行操作

    offset, err := f.Seek(0, os.SEEK_END)
    

    但由于您已经拥有*os.File,您可以调用Stat,即使它是直接从文件描述符派生的。

    【讨论】:

    • 如果我在当前文件打开的情况下调用 os.NewFile 会发生什么。新文件是否是当前文件的副本?
    • @CubeyMew:这是同一个文件描述符,所以什么也没有发生。即使您使用新的 fd 打开它,打开文件也不会复制它。
    • 我想先使用 Open 来获取 *File。然后使用 Create(name string)(*File, error) 来获取 *os.File。这会对文件造成任何影响吗? (我不想将 *os.File 作为参数传递或将其作为结构成员)
    • @CubeyMew:打开文件不会影响文件。如果文件不存在,显然os.Create会起作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-26
    • 1970-01-01
    • 2011-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多