此问题已经在这里有了答案:
我有一个包含一些数据的文件。现在,我想添加一些内容,但不通过附加内容。更像是“在此文件的当前第10和第11个字节之间添加4个字节的块”。目前,我正在使用FileStream来读取和写入文件。所以我的问题是:有没有办法在不重写整个文件的情况下插入此数据?谢谢,指甲。
编辑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
);
这在很多方面都是一个奇怪的表:
您将获得文件的所有群集,如下所示:
SELECT Content FROM Clusters
ORDER BY ClusterNumber
WHERE FK_FileID = /*The while whose whole data you want*/
该索引/主键可能会很好。
如果您想将分段推入其中,则可以:
假设您将其存储在HDD /旋转磁盘存储中,那么无论如何都不会对磁盘进行常规的碎片整理,因此您不妨合并群集以减少浪费。除非您能以某种方式教会DBMS正确阅读此内容(您需要询问DB专家),否则您希望尽可能在DB中按顺序排列文件的所有群集,因此它将一起放在磁盘上好。当然,物理介质是正确的SSD,您可以跳过碎片整理而仅合并。
[高级选项包括诸如提前为文件保留扩展空间(不会再有其他文件使用)之类的东西。因此,它可以将群集保持在一起,并且减少碎片整理的需要。