C#在文件中插入数据而无需重写


我有一个包含一些数据的文件。现在,我想添加一些内容,但不通过附加内容。更像是“在此文件的当前第10和第11个字节之间添加4个字节的块”。目前,我正在使用FileStream来读取和写入文件。
所以我的问题是:有没有办法在不重写整个文件的情况下插入此数据?
谢谢
尼尔斯。

nokiafddfqq 回答:C#在文件中插入数据而无需重写

编辑2-重写

经过大量评论,我发现真正的问题是您拥有一个数据库,该数据库通常像文件系统一样工作。最大的区别可能是群集知道它们所属的文件,而不是相反。我将使用DDL/Shema的文件系统术语。抱歉,我无法正常显示SQL语法。

CREATE TABLE Files(
  ID INTEGER PRIMARY KEY
  /* a bunch of other columns that do not really mater for this */
);

CREATE TABLE Clusters(
  ID INTEGER PRIMARY KEY,FK_FileID INTEGER FOREIGN KEY (Files.ID),-- Special,see text
  ClusterNumber INTEGER,--Special,see text
  Contents --whatver type you need
);

集群在许多方面都是一个奇怪的表:

  • 最重要的键。实际上,您可以适当地删除索引。我拥有它的唯一原因是a)习惯,b)因为您可能会后悔缺少它,并且c)对管理工作可能有用
  • ClusterNumber是“ FK_FileID的第N个群集”
  • ClusterNumber和FK_FileID应该具有一个共享的唯一约束(两者的组合必须是唯一的),并且应该位于覆盖这两者的索引上。可以将它们看作是复合主键或多行代理键(听起来确实像是矛盾词)。您将比官方PK更频繁地使用这些方式。

您将获得文件的所有群集,如下所示:

SELECT Content FROM Clusters 
ORDER BY ClusterNumber 
WHERE FK_FileID = /*The file whose whole data you want*/

该索引可以覆盖其中。

如果您想将分段推到其中的任何位置,您将:

  1. 向上移动以下所有分段ClusterNumber 1
  2. 只需为此文件添加带有新释放的ClusterNumber的Cluster条目
  3. 最后一步可能会有点浪费,就像只添加4个字母的簇一样。

假设将其存储在HDD /旋转磁盘存储中,则可能不会定期对磁盘进行碎片整理,因此您不妨合并群集以减少浪费。除非您能以某种方式教会DBMS正确阅读此内容(您需要咨询DB专家),否则您将希望数据库中尽可能有序地包含文件的所有集群,因此它将一起放在磁盘上好。当然,物理介质是正确的SSD,您可以跳过碎片整理而仅合并。

高级选项包括诸如提前为文件保留扩展空间(不会再有其他文件使用)之类的东西。因此,这些簇可以保持在一起(即使不是按顺序排列),也不需要进行碎片整理。

本文链接:https://www.f2er.com/3141105.html

大家都在问