0

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

然后,非碎片化将获取碎片文件,提取碎片,将它们按顺序排列并允许原始文件完好无损。

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

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

但是,我不确定如何对二进制文件执行类似的操作。

我知道一个简单的解决方案是为 <.part1, .part2> 文件之类的片段使用单独的文件,但这有点难看,并且不能很好地扩展到更大的文件。将其存储在一个文件中会好得多。

非常感谢。

4

2 回答 2

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);

重新组装文件是通过颠倒过程来完成的。读取每条记录,然后使用 usingFragment读取以下数据,然后使用函数 and定位到目标文件中的正确偏移量,然后使用 写入。freadfragment.lengthfseekfragment.offsetfwrite

于 2013-04-13T22:12:52.027 回答
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);
}
于 2013-04-13T22:15:14.857 回答