在C中解析.tar文件

问题描述 投票:-2回答:1

我正在努力提取tar文件,但是在阅读块时我遇到了一个问题。在我的第6次阅读之后,尽管看起来只有不到一半的tar文件,但所有后续的读取都会返回空缓冲区。附加图像显示第6次读取后的缓冲区内容。 tar error上面:缓冲区内容6日读取+文本文件中的这个读取似乎发生。 下图:tar文件的提取内容。 tar file contents

我的第一个读取是文本文件“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);

    }
}

Note: I haven't started actually extracting, I'm just reading to the header buffer in order to see the information that I can read from the tar file. (hence the for loop)

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);
    }
}
c tar
1个回答
0
投票

我最终找到了答案,在我遇到下一个目录之前有大量的空块,所以我只迭代了24次以找到嵌套目录...

© www.soinside.com 2019 - 2024. All rights reserved.