使用c打包文件,以便可以解压缩为原始文件

使用c打包文件,以便可以解压缩为原始文件,c,C,我必须以这种方式打包一些文件,以便在以后的某个阶段,我可以使用c程序再次将它们解包为原始文件。请建议。一个快速的解决方案是利用外部库,如(用法示例:)并将其用于压缩 如果您想更深入地了解压缩主题,请查看不同的无损压缩算法和进一步的提示。一个快速解决方案是利用外部库(如使用示例:)并将其用于压缩 如果您想更深入地了解压缩主题,请查看不同的无损压缩算法和进一步的提示。我想,想要编写自己的实现的原因可能是好奇 无论是否添加压缩,如果您只是想将文件存储在存档中,类似于tar命令,那么您有几种可能的方法

我必须以这种方式打包一些文件,以便在以后的某个阶段,我可以使用c程序再次将它们解包为原始文件。请建议。

一个快速的解决方案是利用外部库,如(用法示例:)并将其用于压缩


如果您想更深入地了解压缩主题,请查看不同的无损压缩算法和进一步的提示。

一个快速解决方案是利用外部库(如使用示例:)并将其用于压缩


如果您想更深入地了解压缩主题,请查看不同的无损压缩算法和进一步的提示。

我想,想要编写自己的实现的原因可能是好奇

无论是否添加压缩,如果您只是想将文件存储在存档中,类似于
tar
命令,那么您有几种可能的方法

您必须做出的一个基本选择是:如何在归档中划分打包文件的边界?使用特殊字符不是一个好主意,因为打包文件可以包含任何字符

要跟踪文件的结尾,可以使用文件的长度(以字节为单位)。例如,对于每个文件,您可以:

  • 将命名打包文件的以“\0”结尾的C字符串写入存档
  • 向归档文件写入off64\t,它给出压缩文件的长度(以字节为单位)
  • 将打包文件的实际字节(如果有)写入存档
  • (可选)将压缩文件的校验和或CRC写入存档
  • 对每个文件重复执行此操作,将结果连接在一起,不使用中间字符

    最后,当没有文件保留时,写一个空的C字符串,一个零字符

    拆包过程是:

  • 读取命名此打包文件的以“\0”结尾的C字符串
  • 如果名称为空,则断言我们已读取整个存档,然后退出
  • 读取给出压缩文件长度的off64\t
  • 从归档文件中读取与压缩文件长度相同的字节数,然后写入新创建的未压缩文件
  • 再次重复这些步骤,直到步骤(2)结束程序

    这种文件名与文件数据交替的设计是可行的。它有一些缺点。关键问题是数据结构不是为随机访问而设计的。为了获得有关档案“中间”文件的信息,需要一个程序来处理前面的文件。程序可以调用
    lseek_64
    跳过读取不需要的程序数据,但处理器至少需要读取每个文件名和每个文件长度。跳过文件数据需要文件长度。在我整理数据时,必须读取文件名才能定位文件长度

    所以这是低效的。即使访问文件大小不需要读取文件名,但文件详细信息散布在整个归档文件中这一事实意味着读取索引数据需要访问磁盘上的多个数据范围

    更好的方法可能是在文件前面写一个索引数据“块”。此数据结构可能类似于:

  • 存档中第一个文件的大小
  • 存档中第一个文件的名称
  • 此归档文件中的位置(以字节为单位),其中“第一个文件”可以作为连续的字节块定位
  • 存档中第二个文件的大小
  • 索引中的数据可能会重复,直到文件名为空时标记索引的结束

    有这样一个索引很好,但也带来了一个困难:当用户希望将文件附加到归档文件时,索引可能需要增加大小。这可能会改变压缩文件在归档文件中的位置——归档程序可能需要移动它们,以便为更大的索引腾出空间


    为了满足所有这些不同的需求,文件结构可能变得越来越复杂。例如,可以设计索引,使其始终从文件系统认为的“页面”(操作系统从磁盘读取或写入的最小大小颗粒)中分配,如果索引需要增长,则不连续的“索引页面”通过从一个索引页面到另一个索引页面的文件位置数据链接在一起。(就像一个链表,但是在磁盘上。)复杂性可以持续不断。

    我想,想要编写自己的实现的原因可能是好奇

    无论是否添加压缩,如果您只是想将文件存储在存档中,类似于
    tar
    命令,那么您有几种可能的方法

    您必须做出的一个基本选择是:如何在归档中划分打包文件的边界?使用特殊字符不是一个好主意,因为打包文件可以包含任何字符

    要跟踪文件的结尾,可以使用文件的长度(以字节为单位)。例如,对于每个文件,您可以:

  • 将命名打包文件的以“\0”结尾的C字符串写入存档
  • 向归档文件写入off64\t,它给出压缩文件的长度(以字节为单位)
  • 将打包文件的实际字节(如果有)写入存档
  • (可选)将压缩文件的校验和或CRC写入存档
  • 对每个文件重复执行此操作,将结果连接在一起,不使用中间字符

    最后,当没有文件保留时,写一个空的C字符串,一个零字符

    拆包过程是:

  • 读取命名此打包文件的以“\0”结尾的C字符串
  • 如果名称为空,则声明我们已读取整个存档,然后退出。
  • <file-type,file-path,file-size,file-mode>
    <0,foo.txt,245,0755>
    here the file contents