【问题标题】:Append file to the end of an archive in C [closed]将文件附加到 C 中存档的末尾 [关闭]
【发布时间】:2013-07-19 18:07:30
【问题描述】:

有人可以指出如何将多个文件附加到 C 中的存档文件的正确方向吗?

下面是我打算做的事情。你能告诉我这是否是正确的方法(如果不是,你能告诉我哪种方法更好)吗?非常感谢!

-使用OPEN打开存档文件(O_RDONLY | O_WRONLY | O_APPEND) -使用WRITE将常规文件写入归档

【问题讨论】:

  • 什么样的“存档”? tar 存档? ar 存档?压缩? 7压缩包?还有什么?
  • 任何特定类型的存档?
  • 这是一个存档文件——例如文本.a
  • 您必须做的不仅仅是附加到文件(另外,O_RDWR 可以用来代替 O_RDONLY | O_WRONLY
  • 您是否正在阅读您之前关于该主题的问题的答案?根据this answer 对您前几天提出的问题,存档文件的格式是系统特定的,不一定完全直截了当。

标签: c operating-system append


【解决方案1】:

如果你检查你会看到存档文件的格式,你应该有一个名为ar.h(通常位于/usr/include/)的系统头文件。

存档中的每个文件都是一个ar_hdr 结构,后跟文件内容的数据。因此,要将文件附加到存档中,您只需编写正确的结构,后跟要附加的文件的内容。

【讨论】:

  • 感谢您的提示!我真的在为我的家庭作业而苦苦挣扎。你介意告诉我你的意思是“写一个正确的结构,然后是你想要附加的文件的内容”吗?
  • 是的,这几乎是正确的。虽然我没有研究过 Linux 上的文件格式(大概是提问者的操作系统),但在 Solaris 上,如果文件名超过一定长度,它会存储在符号表中,而不是文件头条目中。
【解决方案2】:

为了将文件(甚至一个文件)添加到存档文件中,您首先需要了解存档的格式。如果您已经研究过操作系统提供的文件格式的文档(如 this answer 对您之前的问题所建议的那样),那么您应该已经对文件格式有足够的了解,您不需要问我们怎么做。

C 没有名为 OPENWRITE 的函数。有open()write(),但是请注意O_RDONLY|O_WRONLY 不等同于O_RDWR。您可以使用 write() 将文件的内容写入存档的末尾,是的,但是 (a) 不要忘记先写入文件头,并且 (b) 你确定 你不需要更新档案的符号表吗? (如果这样做,您可能需要重写整个文件。)

您为什么不再次使用ar 命令行实用程序?

【讨论】:

  • @Elchonon Edelson:感谢您回答我的问题。对于我的学校作业,我需要用 C 编写一些与 ar 命令(例如 ar -t 和 ar -q)类似的代码。可悲的是,我的课堂讲座或课堂笔记都没有谈论 ar.h,我真的很困惑。我花了很多时间寻找答案。我查看了笔记本电脑上的 ar.h 文件。由于编程经验有限(在校 3 个季度),我真的很难理解如何使用存档文件。如果您知道有关使用存档文件和 ar.h 的任何教程,请告诉我。谢谢。
  • 使用存档文件与使用任何具有已定义结构的文件基本相同。您需要解释文件内容结构的文档,并编写代码以符合该结构。在这种情况下,文件结构是专有的,我无法找到 GNU 库使用的文件结构的文档。 Oracle Solaris 10 使用的该文件的文档是 here,GNU 库可能不同。
  • 非常感谢您的参考!
  • 真正进入文件结构的唯一方法是使用ar命令创建一堆不同的档案,然后根据文档,编写代码打开文件并列出内容,并检查您是否正确。 (然后,根据您对文件结构的了解编写代码来更新或修改文件,并将结果与​​您使用ar 执行相同操作时得到的结果进行比较...)
  • ar 命令 (here) 的 POSIX 文档还提供了存档文件格式的示例,快速阅读显示与 Solaris 所做的一些显着不同,很好地说明了我对格式未标准化的观点。
猜你喜欢
  • 2017-06-15
  • 1970-01-01
  • 1970-01-01
  • 2016-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-11
  • 1970-01-01
相关资源
最近更新 更多