Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 文件结构,以避免重写整个文件_C# - Fatal编程技术网

C# 文件结构,以避免重写整个文件

C# 文件结构,以避免重写整个文件,c#,C#,我正在设计一种定制的二进制文件格式,允许我重写部分文件而不覆盖整个文件。数据由长度可变的“元素”组成。可以在文件中删除、插入或修改这些元素。这种修改可能会改变元件的长度 以下是我正在考虑的: 该文件由两个主要部分组成:头和正文 身体被分成预定大小的块,平均容纳100个元素。创建元素时,它们将被写入第一个块,并留有足够的空间容纳它 修改图元时,如果块中有足够的空间容纳该图元,则重写该图元,否则将从块中删除该图元(然后重写该块),然后将其插入到另一个具有所需空间的块中 标头包含指向每个块的地址及其

我正在设计一种定制的二进制文件格式,允许我重写部分文件而不覆盖整个文件。数据由长度可变的“元素”组成。可以在文件中删除、插入或修改这些元素。这种修改可能会改变元件的长度

以下是我正在考虑的:

  • 该文件由两个主要部分组成:头和正文

  • 身体被分成预定大小的块,平均容纳100个元素。创建元素时,它们将被写入第一个块,并留有足够的空间容纳它

  • 修改图元时,如果块中有足够的空间容纳该图元,则重写该图元,否则将从块中删除该图元(然后重写该块),然后将其插入到另一个具有所需空间的块中
  • 标头包含指向每个块的地址及其当前大小的指针。由于此数据是固定宽度的,因此我可以更改单个标题条目,而无需重写整个标题
我的问题:
如果我需要增加标题的大小,我需要重写整个正文以创建额外的标题空间。如果头文件是与正文分开的文件,我就不会有这个问题,但我不喜欢有两个文件的想法。有没有办法将头文件和正文文件保留在一个物理文件中,但每个文件都可以独立扩展?

您的文件格式应该支持相互链接的头文件列表

在标题中,有一个字段“next”,该字段指向文件中下一个标题的位置。如果需要添加头,请将其添加到文件末尾,然后将其在文件中的位置写入上一个头的“下一个”字段


我的意见是:既然已经有像SQLite这样的解决方案可以很容易地使用,为什么还要发明一种新的格式呢?

您的文件格式应该支持相互链接的标题列表

在标题中,有一个字段“next”,该字段指向文件中下一个标题的位置。如果需要添加头,请将其添加到文件末尾,然后将其在文件中的位置写入上一个头的“下一个”字段


我的意见是:既然已经有像SQLite这样的解决方案可以很容易地使用,为什么还要发明一种新的格式呢?

您计划多久写入一次该文件?您是从一些初始状态开始,然后每隔一段时间记录一次更改,还是一个经常更改的结构,一次更改大量内容?您可以做Zip文件所做的事情:将头放在文件的末尾,并在开始时指向它。您计划多久写入一次文件?你是从一些初始状态开始,然后每隔一段时间记录一次更改,还是一个经常更改的结构,一次更改很多内容?你可以做Zip文件所做的事情:将文件头放在文件的末尾,并在开头指向它的指针。嗯,危险。。。这很有道理。老实说,我们最终可能会使用类似SQLite的东西,而不是发明新的东西。我问这个问题的原因是因为我们目前使用的自定义二进制文件有一些主要缺点。这启发了我考虑如何重构这个自定义二进制文件,以避免这些缺点,如果我想“手动”的话。我曾经在一个特殊的情况下做过一次(数百万条小记录,一次典型的运行将访问成千上万条记录——读取整个索引,缓存从磁盘上提取的任何内容,即使这不是目标),但现在除了文档(pdf、xml等)之外的所有内容都应该是文本或SQL。。。这很有道理。老实说,我们最终可能会使用类似SQLite的东西,而不是发明新的东西。我问这个问题的原因是因为我们目前使用的自定义二进制文件有一些主要缺点。这启发了我考虑如何重构这个自定义二进制文件,以避免这些缺点,如果我想“手动”的话。我曾经在一个特殊情况下做过一次(数百万条小记录,一次典型的运行将访问成千上万条记录——读取整个索引,缓存从磁盘上提取的任何内容,即使这不是目标),但现在除了文档(pdf、xml等)之外的所有内容都应该是文本或SQL。