C:创建存档文件头

时间:2011-01-02 15:29:16

标签: c

我正在使用C中的POSIX API系统调用创建文件存档器/提取器(如tar)。我已经完成了部分存档位。

我想知道是否有人可以帮助我使用一些C源代码(使用上面的代码)来为C中的文件创建文件头(其中头部充当索引),它描述了文件属性/元数据(姓名,日期时间等)。到目前为止我所做的只是理解(不确定是否正确)创建它需要的文件头 用于保存元数据的结构,并且需要lseek来寻找文件的开头/结尾 像:

  

FileName = file.txt FileSize = 0

     

FILEDIR =。/等等/等等

     

FilePerms = 000

     

\ n \ n

程序的归档部分有这个过程:

  1. 从命令行获取所有文件的列表。 (我可以做这部分)
  2. 创建一个结构来保存有关每个文件的元数据:name(255 char),size(64位int),日期和时间以及权限。
  3. 对于每个文件,获取其统计信息。
  4. 将每个文件的统计信息存储在结构数组中。
  5. 打开存档进行编写。 (我可以做这部分)
  6. 编写标题结构。
  7. 对于每个文件,将其内容附加到存档文件(在每个文件的结尾/开头)。
  8. 关闭存档文件。 (我可以做这部分)
  9. 我很难创建整个头文件,即使我知道它需要做什么,正如我所说的那些位上面的编号点所述(2,3,4,6,7)。

    任何帮助将不胜感激。 感谢。

2 个答案:

答案 0 :(得分:9)

答案 1 :(得分:4)

您可以使用stat()系统调用获取每个文件的信息。

对于标题的写入,这里有两个解决方案。

琐碎而邪恶:

struct file_header {
... data you want to put in 
} fhdr;

fwrite(file, fhdr, sizeof(fhdr));

这是邪恶的,因为结构打包因机器而异,字节顺序和基本类型的大小如'int'也是如此。程序编写的文件在另一台机器上编译时可能无法读取,或者在某些情况下甚至可能与同一台机器上的其他编译器一起使用。

非平凡但安全:

char name[xxx];
uint32_t length; /* Fixed byte length across architectures */
...

fwrite(file, name, sizeof(name));
length=htonl(length); /* Or something else that converts 
                         the length to a known endianness */
fwrite(file, &length, sizeof(length);

就个人而言,我不是htonl()和朋友的粉丝,我更喜欢使用移位运算符(可以使用移位运算符轻松编写)来编写将uint32_t转换为uchar [4]的东西,因为C不会确定内存中甚至整数的格式。在实践中,你很难找到一些不会将uint32_t存储为8位的4字节的东西,但这是需要考虑的事情。

上面列出的变量可以是结构中的结构成员。将阅读过程颠倒过来是留给读者的练习。