我正在使用C中的POSIX API系统调用创建文件存档器/提取器(如tar)。我已经完成了部分存档位。
我想知道是否有人可以帮助我使用一些C源代码(使用上面的代码)来为C中的文件创建文件头(其中头部充当索引),它描述了文件属性/元数据(姓名,日期时间等)。到目前为止我所做的只是理解(不确定是否正确)创建它需要的文件头 用于保存元数据的结构,并且需要lseek来寻找文件的开头/结尾 像:
FileName = file.txt FileSize = 0
FILEDIR =。/等等/等等
FilePerms = 000
\ n \ n
程序的归档部分有这个过程:
我很难创建整个头文件,即使我知道它需要做什么,正如我所说的那些位上面的编号点所述(2,3,4,6,7)。
任何帮助将不胜感激。 感谢。
答案 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字节的东西,但这是需要考虑的事情。
上面列出的变量可以是结构中的结构成员。将阅读过程颠倒过来是留给读者的练习。