C#将数据插入文件而不进行重写[重复]

问题描述 投票:-2回答:1

此问题已经在这里有了答案:

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

c# file stream filestream
1个回答
1
投票

编辑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)对管理工作可能有用]
  • ClusterNumber是“ FK_FileID的第N个群集”
  • ClusterNumber和FK_FileID应该具有一个共享的唯一约束(两者的组合必须是唯一的),并且应该位于覆盖这两者的索引上。可以将它们视为复合键或多行代理。您将更经常地使用那些方式作为实际PK。

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

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

该索引/主键可能会很好。

如果您想将分段推入其中,则可以:

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

假设您将其存储在HDD /旋转磁盘存储中,那么无论如何都不会对磁盘​​进行常规的碎片整理,因此您不妨合并群集以减少浪费。除非您能以某种方式教会DBMS正确阅读此内容(您需要询问DB专家),否则您希望尽可能在DB中按顺序排列文件的所有群集,因此它将一起放在磁盘上好。当然,物理介质是正确的SSD,您可以跳过碎片整理而仅合并。

[高级选项包括诸如提前为文件保留扩展空间(不会再有其他文件使用)之类的东西。因此,它可以将群集保持在一起,并且减少碎片整理的需要。

© www.soinside.com 2019 - 2024. All rights reserved.