c++ - 在 C++ 中截断文件

标签 c++ file file-io logging filestream

我正在用 C++ 编写一个程序,想知道是否有人可以帮助我解决这里解释的情况。

  1. 假设,我有一个大约 30MB 的日志文件,我已将文件的最后 2MB 复制到程序中的缓冲区。

  2. 我删除文件(或清除内容),然后将我的 2MB 写回文件。

到这里为止一切正常。但是,问题是我读取了文件(最后 2MB)并清除了文件(30MB 文件),然后写回了最后 2MB。 如果在我从 1GB 文件复制最后 300MB 文件的情况下,将需要很多时间。

有没有人有简化此过程的想法?

当日志文件很大时,应该并且将会考虑以下原因。

磁盘空间:日志文件是未压缩的纯文本,会占用大量空间。 典型压缩将文件大小减少 10:1。但是不能压缩文件 使用时(锁定)。因此必须轮换使用日志文件。

系统资源: 定期打开和关闭文件会占用大量系统资源 资源,它会降低服务器的性能。

文件大小:小文件更容易备份和在发生故障时恢复。

我只是不想将最后的特定行复制、清除和重新写入文件。只是一个更简单的过程.... :-)

编辑:没有制定任何内部流程来支持日志轮换。 logrotate 是工具。

最佳答案

我会建议一种稍微不同的方法。

  1. 创建一个新的临时文件
  2. 将所需数据从原始文件复制到临时文件
  3. 关闭两个文件
  4. 删除原文件
  5. 将临时文件重命名为与原始文件相同的名称

为了提高复制的性能,您可以分块复制数据,您可以调整 block 大小来找到最佳值。

关于c++ - 在 C++ 中截断文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5828507/

相关文章:

Java 从二进制文件中转换字符

javascript - 将 Javascript 对象保存到文件

python - 如何获取用户输入并将其写入文本文件?

c++ - ‘断言’函数: weird behavior

c++ - X11 中每个窗口的 Display 都是唯一的吗?

c++ - 将 uint64_t 除以 numeric_limits<uint64_t>::max() 为浮点表示形式

php - 如何从文件中获取整个函数

c++ - 模板继承的问题

c# - Windows Phone 8 追加行到文件

android - 使用 Android SDK 的随机访问文件 > 2GB