C中的文件碎片和碎片

时间:2013-04-13 20:51:04

标签: c file parsing temporary-files

我想获取一个文件(文本或二进制文件)并将其分割成一定大小(约250-500kB)的小块,随机化片段的顺序,并将其放入另一个临时的碎片文件中。

然后,取消碎片将获取碎片文件,提取碎片,按顺序放置并允许原始文件保持完整。

对于简单的基于文本的ASCII文件,这将非常容易,因为您可以使用C库函数(如sscanf)来格式化/解析信息。一个文件可以有一个格式,然后像

(#### <fragment #> <fragment> ...)

但是,我不确定如何用二进制文件做这样的事情。

我知道一个简单的解决方案是为片段使用单独的文件,例如&lt; .part1,.part2&gt;文件,但这有点难看,不能很好地扩展到更大的文件。将它存储在一个文件中会好得多。

非常感谢。

2 个答案:

答案 0 :(得分:2)

使用二进制文件执行此操作是最简单的,也是最快且最可靠的。您的片段文件需要一个简单的段记录,它为您提供原始文件中的偏移量和段的长度。记录可能如下所示:

typedef struct _Fragment
{
    unsigned long offset;
    unsigned long length;
} Fragment;

编写文件将如下所示:

Fragment fragment;
FILE *outFile;
unsigned long segmentOffset, segmentLength;
char segmentData[MAXSEGMENTLENGTH];

outFile = fopen(fileName, "wb");

while (ReadNextSegment(segmentData, &segmentOffset, &segmentLength))
{
    fragment.offset = segmentOffset;
    fragment.length = segmentLength;

    fwrite(header, sizeof(fragment), 1, outFile);
    fwrite(segmentData, 1, segmentLength, outFile);
}

fclose(outFile);

通过反转过程完成重新组装文件。阅读每个Fragment记录,然后使用fread使用fragment.length阅读以下数据,然后使用fseek函数和{{1}定位到目标文件中的正确偏移量},然后使用fragment.offset编写它。

答案 1 :(得分:1)

尝试仅使用二进制数据。在碎片文件中,请遵循以下结构:

OFFSET SIZE  DESCRIPTION
     0    4  BLOCK NUMBER
     4    4  BLOCK SIZE IN BYTES
     8    ?  BLOCK DATA

定义标题结构:

typedef struct hdr
{
    uint32_t number;
    uint32_t size;
} hdr_t;

使用它的代码可能如下所示:

void file_append(FILE *f, size_t block, size_t size, const void *data)
{
    hdr_t hdr;
    hdr.number = block;
    hdr.size = size;
    fwrite(&hdr, sizeof(hdr), 1, f);
    fwrite(data, size, 1, f);
}

阅读数据:

void file_read_chunk(FILE *f, size_t *block, size_t *size, void **data)
{
    hdr_t hdr;

    fread(&hdr, sizeof(hdr), f);
    *block = hdr.number;
    *size = hdr.size;
    *data = malloc(hdr.size);
    fread(*data, hdr.size, 1, f);
}