从Windows上的文件中删除前N个字节的最有效方法是什么?

时间:2015-02-18 00:57:26

标签: c++ windows file winapi

说,我有一个任意长度S的文件,我需要删除其N个字节中的第一个(其中N远小于S。)在Windows上执行此操作的最有效方法是什么?

如果有可用的话,我正在寻找WinAPI。

否则,我有什么选择 - 将它加载到RAM然后用剩余的数据重写现有文件? (在这种情况下,我无法确定PC是否有足够的RAM?)或者将剩余的文件数据写入新文件,删除旧文件,并将新文件重命名为旧文件。 (在这种情况下,如果这些步骤中的任何一个失败,该怎么办?再加上这个方法在磁盘上造成的碎片整理怎么办?)

3 个答案:

答案 0 :(得分:1)

在操作系统中没有通用的方法。有一些理论方法可以在扇区或集群边界上编辑操作系统下面的文件系统数据结构,但这对于每个文件系统都是不同的,并且需要违反任何安全模型。

要完成此操作,您可以读取以4k的块为单位从字节N开始的数据,然后从字节0开始将它们写回,然后使用文件truncate命令(setendoffile)设置新的较小的结尾完成复制数据后的文件。

答案 1 :(得分:0)

在文件开头删除数据的最高效方法是修改硬盘驱动器上的目录条目,该条目告知数据的开始位置。同样,这是最高效的方法。

注意:如果数据必须在新边界上开始,则可能无法执行此操作。如果是这种情况,您可能必须将扇区上的剩余数据写入新扇区,基本上是移动数据。

首选方法是编写一个新文件,该文件以删除区域后复制的数据开头。

答案 2 :(得分:0)

Moving files on same drive is faster 而不是复制文件,因为数据不重复;仅更新文件指针、(符号)链接和文件分配/索引表。

可以修改 CMD 中的 move 命令以允许用户设置文件开始和结束标记,在不复制文件数据的情况下实现文件截断,节省宝贵的时间和 RAM/磁盘开销。

替代方法是绕过操作系统将命令直接发送到设备/磁盘驱动程序,只要操作系统知道在哪里可以找到文件和文件属性,例如。磁盘上占用的文件大小、名称和扇区。