是否可以删除文件的一部分(比如说从头到尾),而不必使用另一个文件?
谢谢!
是的,这是可能的,但您仍然必须重写大部分文件。
大致思路如下:
open the file
beg = find the start of the fragment to be removed
len = length of the fragment to be removed
blocksize = 4096 -- example block size, may be any
datamoved = 0
do {
fseek(pos +len +datamoved);
if( endoffile ) return; -- finished!
actualread = fread(buffer, blocksize)
fseek(pos + datamoved)
fwrite(buffer, actualread)
datamoved += actualread
}
循环之后的最后一步是将文件“截断”为 pos+datamoved 大小。如果底层文件系统不处理'truncatefile'操作,那么你必须重写..但大多数文件系统和库都支持。
简短的回答是不,大多数文件系统不会尝试支持这样的操作。
这让你有两个选择。显而易见的一个是创建数据的副本,去掉不需要的部分。您可以就地执行此操作(即,在同一个文件中移动数据)或使用辅助文件,通常将数据复制到新文件,然后执行诸如将新文件重命名为旧名称之类的操作。
另一个主要选择是简单地重新构建您的文件和数据,这样您就不必完全摆脱旧数据。例如,如果你想保留一个进程最近的 N 数据量,你可以将文件(大部分)构造为一个循环缓冲区,在开头有几个“指针”告诉你头和尾点,所以你知道从哪里读取数据/向哪里写入数据。使用这样的结构,您不会擦除或删除旧数据,只需根据需要覆盖它。
如果您有足够的内存,请将其内容完全读取到内存中,将其复制回文件的前面,然后截断文件。
如果您没有足够的内存,请在块中复制,并且仅在您完成后截断文件。