从 Windows 上的文件中删除前 N 个字节的最有效方法是什么?
What is the most efficient way to remove first N bytes from a file on Windows?
说,我有一个任意长度的文件 S
,我需要删除它的第一个 N
字节(其中 N
远小于 S
.) 在 Windows 上最有效的方法是什么?
我正在寻找一个 WinAPI 来执行此操作,如果有的话。
否则,我有什么选择 -- 将其加载到 RAM 中,然后用剩余数据重写现有文件? (在这种情况下我不能确定PC是否有足够的RAM?)或者将剩余的文件数据写入一个新文件,擦除旧文件,并将新文件重命名为旧文件。 (在这种情况下,如果这些步骤中的任何一个失败怎么办?加上此方法在磁盘上导致的碎片整理如何?)
OS 中没有通用的方法来执行此操作。理论上有一些方法可以在操作系统下的扇区或集群边界上编辑文件系统的数据结构,但这对于每个文件系统都是不同的,并且需要违反任何安全模型。
要完成此操作,您可以以 4k 块的形式从字节 N 开始读取数据,然后从字节零开始将它们写回,然后使用文件截断命令 (setendofffile) 将新的更小的数据设置为完成数据复制后文件结束。
最有效删除文件开头数据的方法是修改硬盘驱动器上的目录条目,该目录条目指示数据从何处开始。同样,这是最 高效 的方法。
注意:如果数据必须从新边界开始,这可能是不可能的。如果是这种情况,您可能必须将扇区上的剩余数据写入新扇区,实质上是移动数据。
首选方法是写入一个新文件,该文件以删除区域之后复制的数据开始。
Moving files on same drive is faster 而不是复制文件,因为数据不会重复;仅更新文件指针、(符号)链接和文件 allocation/index table。
可以修改 CMD 中的 move
命令以允许用户设置文件开始和结束标记,在不复制文件数据的情况下实现文件截断,节省宝贵的时间和 RAM/Disk 开销。
另一种方法是绕过操作系统将命令直接发送到 device/disk 驱动程序,只要 OS 知道在哪里可以找到文件和文件属性,例如。磁盘上占用的文件大小、名称和扇区。
说,我有一个任意长度的文件 S
,我需要删除它的第一个 N
字节(其中 N
远小于 S
.) 在 Windows 上最有效的方法是什么?
我正在寻找一个 WinAPI 来执行此操作,如果有的话。
否则,我有什么选择 -- 将其加载到 RAM 中,然后用剩余数据重写现有文件? (在这种情况下我不能确定PC是否有足够的RAM?)或者将剩余的文件数据写入一个新文件,擦除旧文件,并将新文件重命名为旧文件。 (在这种情况下,如果这些步骤中的任何一个失败怎么办?加上此方法在磁盘上导致的碎片整理如何?)
OS 中没有通用的方法来执行此操作。理论上有一些方法可以在操作系统下的扇区或集群边界上编辑文件系统的数据结构,但这对于每个文件系统都是不同的,并且需要违反任何安全模型。
要完成此操作,您可以以 4k 块的形式从字节 N 开始读取数据,然后从字节零开始将它们写回,然后使用文件截断命令 (setendofffile) 将新的更小的数据设置为完成数据复制后文件结束。
最有效删除文件开头数据的方法是修改硬盘驱动器上的目录条目,该目录条目指示数据从何处开始。同样,这是最 高效 的方法。
注意:如果数据必须从新边界开始,这可能是不可能的。如果是这种情况,您可能必须将扇区上的剩余数据写入新扇区,实质上是移动数据。
首选方法是写入一个新文件,该文件以删除区域之后复制的数据开始。
Moving files on same drive is faster 而不是复制文件,因为数据不会重复;仅更新文件指针、(符号)链接和文件 allocation/index table。
可以修改 CMD 中的 move
命令以允许用户设置文件开始和结束标记,在不复制文件数据的情况下实现文件截断,节省宝贵的时间和 RAM/Disk 开销。
另一种方法是绕过操作系统将命令直接发送到 device/disk 驱动程序,只要 OS 知道在哪里可以找到文件和文件属性,例如。磁盘上占用的文件大小、名称和扇区。