在文件中注入数据(删除数据而不覆盖原始内容)

时间:2015-04-01 19:18:47

标签: c# file inject

我一直在研究这个问题。避风港找不到答案。 是否可以在不覆盖数据的情况下将数据插入/删除?我知道那里File.AppendAllText(Path, "Content");但是删除它呢?

例如。

我们收到了"Things.CB"个文件。该文件的内容是:

-1
-2
-3
-4
-5
-6
-7
-8
-9
-10

我想删除7和4。

我用我的程序打开文件,然后继续将这些数字读入List<String>

发生这种情况时,在对列表执行RemoveAt()后,我必须序列化该文件,然后使用BinaryWriterstreamWriter保存该文件。

在这个过程中,我们做了两件事,阅读整个文件,反序列化然后对其进行序列化,以便我们再次编写它。

我想知道是否可以只打开文件,检查文本的位置然后删除/插入并保存它而不需要序列化或读入列表/数组/等...

1 个答案:

答案 0 :(得分:0)

根据您的操作系统,如果您使用的是FAT / NTFS,则可以使用Microsoft API函数来播放特定文件的FAT / NTFS结构。

考虑到你的文件有三个部分...... 1,2,3。你想要删除第2部分。所以你将操纵FAT,这样第1部分的结尾现在指向第3部分的开头 - 有效地从FAT中删除第2部分并使其显示为已删除。然后你没有移动任何数据,只需更改FAT中文件的各种簇和位置标记。

您可以使用相同的技术插入数据......只需调整指针即可。存储在FAT(文件索引)中,以便您的新数据位于文件中所需的位置。无需移动任何文件内容。

这些API函数通常用于对程序进行碎片整理(使用此术语进行谷歌搜索)并具有对文件结构的完全访问权限(虽然我并不完全确定它们有足够的动态来绕过数据想要删除,而不移动其他文件内容。他们应该)。要进入较低级别需要C / C ++,并且可能变得非常危险(备份所有内容)和特定于硬件。您可以使用C#/ VB.NET访问API,虽然它有点单调乏味,但像VB6这样的东西可以更快地围绕API函数进行开发,尽管它对于通用编码很笨拙。

这不适用于网络,因此仅适用于操作系统物理管理的驱动器。如果要删除非常小的数据,这也可能不起作用,因为FAT管理功能的粒度可能不会那么小。