【问题标题】:How to get file size without holes in C [closed]如何在C中获得没有孔的文件大小[关闭]
【发布时间】:2020-07-06 13:55:42
【问题描述】:

所以我试图在 C 中获取文件的大小。

我知道在 C 中获取文件大小的两种方法,使用stat 结构的st_size 成员或在文件的开头和结尾之间使用fseek。

但是,我担心st_size 方法是否会在文件有漏洞时报告文件的“错误大小”。 我想如果文件有漏洞,fseek 方法肯定会产生不正确的结果,对吗?

根据“UNIX 环境中的高级编程”一书第 4.12 节,解决此问题的一种方法是将文件复制到内存中并从内存中读取其大小。但我不知道如何在 C 中做到这一点,所以我想知道你到底是怎么做到的。

感谢任何帮助。

【问题讨论】:

  • 你是如何定义一个洞的?
  • 您所说的“无孔”到底是什么意思?如果您的意思是 Unix 不存储完整的零字节块的做法,那么这些未存储的字节与文件的任何其他部分一样多。为什么你不想计算它们?如果你想要du 大小,du 已经存在。
  • 顺便说一句,du 的大小是根据stat 的st_blocks 成员计算得出的。
  • 我认为你误解了史蒂文斯的那段话。
  • 你当然是。它没有说任何这样的事情。它说相反。如果您读取带有孔的文件,则孔将填充零字节。计算这样做的结果会得到与st_size 相同的结果。

标签: c file unix dirent.h


【解决方案1】:

假设您的意思是磁盘上存储文件数据的物理块之间的“漏洞” - 这些不计入文件的一部分,并且这两种方法都只会考虑正确的文件数据。在文件抽象中,没有“漏洞”。

【讨论】:

  • 感谢您的快速回复,但是this example 呢?同样来自我之前提到的同一本书。它正在从文件系统访问文件,但它在文件大小输出中出现了漏洞。
  • @AbdelsalamElTamawy:你漏掉了链接。
  • 对此感到抱歉。修好了。
  • 好吧,正如您在自己的示例中看到的 - 抽象文件大小和实际磁盘使用情况是不同的。空的、统一的或未初始化的块可以在不使用磁盘页面的情况下存在……但这并没有改变我的答案。考虑在您的问题中添加该图像和解释;或者也许 - 重述问题,以便您询问文件使用的磁盘空间量,而不是“文件大小”。
猜你喜欢
  • 1970-01-01
  • 2013-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-11
  • 1970-01-01
  • 2010-11-25
相关资源
最近更新 更多