【发布时间】:2019-11-07 23:25:08
【问题描述】:
我有一个文件,里面有一些数据。现在我想添加一些内容,但不是通过附加它。更像是“在此文件的当前第 10 和第 11 字节之间添加这个 4 字节块”。目前我正在使用 FileStream 来读取和写入文件。
所以我的问题是:有没有办法在不重写整个文件的情况下插入这些数据?
谢谢,
尼尔斯。
【问题讨论】:
标签: c# file stream filestream
我有一个文件,里面有一些数据。现在我想添加一些内容,但不是通过附加它。更像是“在此文件的当前第 10 和第 11 字节之间添加这个 4 字节块”。目前我正在使用 FileStream 来读取和写入文件。
所以我的问题是:有没有办法在不重写整个文件的情况下插入这些数据?
谢谢,
尼尔斯。
【问题讨论】:
标签: c# file stream filestream
编辑 2 - 重写
经过大量 cmets 后,我发现真正的问题是您的数据库大多像文件系统一样工作。最大的区别可能是集群知道它们所属的文件,而不是相反。我将为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
);
Clusters 在很多方面都是一个奇怪的表:
你会得到这样一个文件的所有集群:
SELECT Content FROM Clusters
ORDER BY ClusterNumber
WHERE FK_FileID = /*The file whose whole data you want*/
那个额外的索引会很好地覆盖。
如果您想在其中的任何地方推入一个片段,您会:
假设您将其存储在 HDD/旋转磁盘存储上,您可能无论如何都无法避免定期进行碎片整理,因此您不妨在这样做的同时整合集群以减少浪费。除非您能以某种方式教 DBMS 正确阅读此内容(您需要为此向 DB 专家咨询),否则您希望尽可能多地在 DB 中按顺序排列文件的所有集群,以便将它们一起放在磁盘上出色地。当然是物理介质是合适的SSD,可以跳过碎片整理,只做整合。
高级选项包括提前为文件(其他文件不会使用)保留扩展空间等内容。所以集群可以保持在一起(即使不按顺序),并且碎片整理的需要更少。
【讨论】: