【问题标题】:Inject data in file (deleting data without overwriting original content)在文件中注入数据(删除数据而不覆盖原始内容)
【发布时间】:2015-04-01 19:18:46
【问题描述】:

我一直在研究这个。还没有找到关于它的答案。 是否可以在不覆盖文件的情况下插入/删除数据?我知道有File.AppendAllText(Path, "Content"); 但是删除它呢?

例如。

我们有一个"Things.CB" 文件。这个文件的内容是:

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

我想删除 7 和 4。

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

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

在这个过程中,我们做了两件事,读取整个文件,反序列化然后序列化它,以便我们可以再次写入。

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

【问题讨论】:

  • 您准备好进入非常低的级别并篡改硬盘驱动器上的集群了吗?您可以修改 FAT (NTFS..whatever),以便您基本上将文件分段,移动到您要删除的部分。然后,除了 FAT(或在您的特定操作系统中调用的任何文件分配表)之外,您绝对没有更改任何磁盘内容
  • 通过随机访问文件,您可以覆盖内容(例如,使用空格),但不能删除(制作一个 20 字节的文件一个 16 字节的,在“删除”4 和 7 之后)。而且,IIRC,随机访问只会加载整个扇区或内存,进行更改并再次写回......(不,您不能部分写入扇区)。
  • 我不确定我是否准备好了,但我可以开始学习,是否可以使用 C# 来做到这一点?还是我必须使用像 c++ 这样的低级语言?

标签: c# file inject


【解决方案1】:

根据您的操作系统,如果您使用的是 FAT/NTFS,您可以使用 Microsoft API 函数来处理某个文件的 FAT/NTFS 结构。

假设您的文件包含三个部分...1、2、3。您想删除第 2 部分。因此,您将操纵 FAT,使第 1 部分的结尾现在指向第 3 部分的开头 - 有效地将第 2 部分从 FAT 中删除并使其看起来已删除。那么你并没有移动任何数据,只是改变了FAT中文件的各种簇和位置标记。

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

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

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

【讨论】:

    猜你喜欢
    • 2013-04-17
    • 2018-03-05
    • 1970-01-01
    • 1970-01-01
    • 2011-08-29
    • 2013-11-27
    • 1970-01-01
    • 1970-01-01
    • 2018-11-12
    相关资源
    最近更新 更多