如何在不使用其他文件的情况下剪切文件?

时间:2012-08-31 22:06:32

标签: c++ logging stl fstream

是否可以删除文件的一部分(让我们说从开头到一半),而不必使用其他文件?

感谢的!

3 个答案:

答案 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)

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

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