我正在努力提取tar文件,但是在阅读块时我遇到了一个问题。在我的第6次阅读之后,尽管看起来只有不到一半的tar文件,但所有后续的读取都会返回空缓冲区。附加图像显示第6次读取后的缓冲区内容。 上面:缓冲区内容6日读取+文本文件中的这个读取似乎发生。 下图:tar文件的提取内容。
我的第一个读取是文本文件“testfile”的头文件,第二个读取是该文件的内容。我的第3次读取是文件夹“testdir”的标题。我的第4次读取返回(我认为)“testdir /._。DS_Store”的头文件,但我不知道那是什么;第5次读取为空,第6次读取返回“testdir / .DS_Store”的头文件,我也不知道这是什么。看看.tar文件的文本格式,似乎应该有更多的信息,但我似乎无法访问它,并因此丢失了嵌套文件夹/文本文件。
这是我的代码:
extract.c:
#include <stdio.h>
#include <fcntl.h>
#include "shared.h"
#include "extract.h"
void extract(char* tarfile) {
int in, out, i;
Header header;
in = safe_open(tarfile, O_RDONLY, 0);
for(i = 0; i < 6; i++) {
safe_read(in, &header, BLK_SIZE);
}
}
shared.h:
#define BLK_SIZE 512
typedef struct posix_header { /* byte offset */
char name[NAME_LEN]; /* 0 */
char mode[8]; /* 100 */
char uid[8]; /* 108 */
char gid[8]; /* 116 */
char size[12]; /* 124 */
char mtime[12]; /* 136 */
char chksum[CHKSUM_LEN]; /* 148 */
char typeflag; /* 156 */
char linkname[NAME_LEN]; /* 157 */
char magic[6]; /* 257 */
char version[2]; /* 263 */
char uname[32]; /* 265 */
char gname[32]; /* 297 */
char devmajor[8]; /* 329 */
char devminor[8]; /* 337 */
char prefix[PREFIX_LEN]; /* 345 */
char extra_padding[12]; /* 500 */
} Header; /* 512 */
int safe_open(const char* pathname, int flags, mode_t mode);
shared.c:
void safe_read(int fd, void* buf, size_t count) {
if (read(fd, buf, count) < 0) {
perror(READ_ERR);
exit(1);
}
}
我最终找到了答案,在我遇到下一个目录之前有大量的空块,所以我只迭代了24次以找到嵌套目录...