是否可以删除文件的一部分(让我们说从开头到一半),而不必使用其他文件?
感谢的!
答案 0 :(得分:3)
是的,这是可能的,但你仍然需要重写大部分文件。
粗略的想法如下:
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'操作,那么你必须重写..但是大多数文件系统和库都支持它。
答案 1 :(得分:2)
简短的回答是,不,大多数文件系统都不会尝试支持这样的操作。
这给你留下了两个选择。显而易见的是创建数据的副本,省去你不想要的部分。您可以就地执行此操作(即,在同一文件中移动数据)或使用辅助文件,通常将数据复制到新文件,然后执行类似将新文件重命名为旧名称的操作。 / p>
另一个主要选择是简单地重新构建您的文件和数据,这样您就不必完全删除旧数据。例如,如果要保留进程中最近的N个数据量,可以将(大部分)文件构造为循环缓冲区,并在开头用几个“指针”告诉您头尾点,所以你知道从哪里读取/写入数据的数据。使用这样的结构,您不会删除或删除旧数据,只需根据需要覆盖它。
答案 2 :(得分:1)
如果你有足够的内存,请将其内容完全读入内存,将其复制回文件的前面,然后截断文件。
如果没有足够的内存,请在块中复制,并且只有在完成后才会截断文件。