0

是否可以删除文件的一部分(比如说从头到尾),而不必使用另一个文件?

谢谢!

4

3 回答 3

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'操作,那么你必须重写..但大多数文件系统和库都支持。

于 2012-08-31T22:14:01.827 回答
2

简短的回答是不,大多数文件系统不会尝试支持这样的操作。

这让你有两个选择。显而易见的一个是创建数据的副本,去掉不需要的部分。您可以就地执行此操作(即,在同一个文件中移动数据)或使用辅助文件,通常将数据复制到新文件,然后执行诸如将新文件重命名为旧名称之类的操作。

另一个主要选择是简单地重新构建您的文件和数据,这样您就不必完全摆脱旧数据。例如,如果你想保留一个进程最近的 N 数据量,你可以将文件(大部分)构造为一个循环缓冲区,在开头有几个“指针”告诉你头和尾点,所以你知道从哪里读取数据/向哪里写入数据。使用这样的结构,您不会擦除或删除旧数据,只需根据需要覆盖它。

于 2012-09-07T14:12:58.020 回答
1

如果您有足够的内存,请将其内容完全读取到内存中,将其复制回文件的前面,然后截断文件。

如果您没有足够的内存,请在块中复制,并且仅在您完成后截断文件。

于 2012-08-31T22:12:16.073 回答