我想获取一个文件(文本或二进制文件)并将其分割成一定大小(约250-500kB)的小块,随机化片段的顺序,并将其放入另一个临时的碎片文件中。
然后,取消碎片将获取碎片文件,提取碎片,按顺序放置并允许原始文件保持完整。
对于简单的基于文本的ASCII文件,这将非常容易,因为您可以使用C库函数(如sscanf)来格式化/解析信息。一个文件可以有一个格式,然后像
(#### <fragment #> <fragment> ...)
但是,我不确定如何用二进制文件做这样的事情。
我知道一个简单的解决方案是为片段使用单独的文件,例如&lt; .part1,.part2&gt;文件,但这有点难看,不能很好地扩展到更大的文件。将它存储在一个文件中会好得多。
非常感谢。
答案 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);
}