我正在用 C++ 编写一个程序,想知道是否有人可以帮助我解决这里解释的情况。
假设,我有一个大约 30MB 的日志文件,我已将文件的最后 2MB 复制到程序中的缓冲区。
我删除文件(或清除内容),然后将我的 2MB 写回文件。
到这里为止一切正常。但是,问题是我读取了文件(最后 2MB)并清除了文件(30MB 文件),然后写回了最后 2MB。 如果在我从 1GB 文件复制最后 300MB 文件的情况下,将需要很多时间。
有没有人有简化此过程的想法?
当日志文件很大时,应该并且将会考虑以下原因。
磁盘空间:日志文件是未压缩的纯文本,会占用大量空间。 典型压缩将文件大小减少 10:1。但是不能压缩文件 使用时(锁定)。因此必须轮换使用日志文件。
系统资源: 定期打开和关闭文件会占用大量系统资源 资源,它会降低服务器的性能。
文件大小:小文件更容易备份和在发生故障时恢复。
我只是不想将最后的特定行复制、清除和重新写入文件。只是一个更简单的过程.... :-)
编辑:没有制定任何内部流程来支持日志轮换。 logrotate 是工具。
最佳答案
我会建议一种稍微不同的方法。
- 创建一个新的临时文件
- 将所需数据从原始文件复制到临时文件
- 关闭两个文件
- 删除原文件
- 将临时文件重命名为与原始文件相同的名称
为了提高复制的性能,您可以分块复制数据,您可以调整 block 大小来找到最佳值。
关于c++ - 在 C++ 中截断文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5828507/