如何读取/写入特定数量的字节到文件

时间:2012-12-22 20:10:09

标签: c# .net file filesystems filestream

我希望通过在大小块中构建文件来创建文件。基本上我正在寻找创建一个基本的文件系统。

我需要编写一个标题,然后编写相同大小/结构的“无限”可能数量的条目。重要的部分是:

  • 每个数据块都需要单独读/写
  • 标题需要作为自己的实体可读/可写
  • 需要一种方法来存储此数据,并能够快速确定其在文件中的位置

可以想象文件类似于:

[HEADER][DATA1][DATA2][DATA3][...]

处理这样的事情的正确方法是什么?假设我想从文件中读取DATA3,我怎么知道数据块的起始位置?

3 个答案:

答案 0 :(得分:1)

如果我理解正确并且您需要一种方法为DATA块分配一种名称/ ID,您可以尝试引入另一种类型的块。

我们称之为TOC(目录)。 因此,文件结构将类似于[HEADER][TOC1][DATA1][DATA2][DATA3][TOC2][...]

TOC chunk将包含名称/ ID以及对多个DATA块的引用。此外,它将包含一些内部数据,例如指向下一个TOC块的指针(因此,您可以将每个TOC块视为链接列表节点。)

在运行时,所有TOC块都可以表示为一种HashMap,其中key是DATA块的名称/ ID,值是它在文件中的位置。< / p>

答案 1 :(得分:0)

我们可以在标题中存储块的大小。如果块的大小是可变的,则可以存储指向实际块的指针。可变大小的有趣设计是在postgres堆文件页面中。 http://doxygen.postgresql.org/bufpage_8h_source.html

答案 2 :(得分:0)

我正在逆向工作,但这可能有所帮助。

我为二进制文件编写反编译器。通常,存在已知字节数的固定标头。这包含特定的文件标识,因此我们可以识别我们正在处理的文件类型。

接下来将是一个固定数量的字节,包含部分的数量(数据组)这个数字然后告诉我们将有多少数据指针。每个数据指针可以是表示数据块开始的四个字节(或任何您需要的)。由此我们可以计算出每个块的大小。然后,反编译器一次一个地读取块以获得每个数据块的文件中的大小和位置。然后,工作是提取该字节块并执行所需的任何操作。

我们一次遍历文件一个块。最后一个块的大小是指向文件末尾的开始指针。