【问题标题】:How to truncate a file from the end? (cross platform)如何从末尾截断文件? (跨平台)
【发布时间】:2012-04-01 09:46:12
【问题描述】:

我正在尝试寻找一种跨平台的方法来从文件末尾删除X 字节。

目前我发现:

  • 特定于平台的解决方案(例如 truncate for posix):这是我不想要的,因为我希望 C++ 程序在多个平台上运行。

  • 读入整个文件,然后再次写出文件减去我要删除的字节:我想尽可能避免这种情况,因为我希望程序尽可能高效和快速

有什么想法吗?

如果有“转到文件流的末尾”方法/函数,我可以倒回 X 字节并切断文件的其余部分或类似的东西吗?

【问题讨论】:

  • 您可以为特定于平台的方法编写跨平台包装器。
  • “我希望 C++ 程序在多个平台上运行”你能告诉我们你想在哪些平台上运行吗?
  • 坦率地说,我只使用 unix,但这是一个非常理想的任务,任何支持 C++ 的平台。
  • @user1255592:这可能是无限的。我可以在我的胸毛中实现一个 C++ 解释器......你应该支持吗?

标签: c++ file io truncate


【解决方案1】:

标准库中没有这样的东西。它们支持流——但流没有结尾,文件恰好在当前时间有结尾。

您所能做的就是在函数上编写一个跨平台的包装器。

【讨论】:

  • 好的...一个略有不同但相关的问题;对于给定的操作系统,比如说 windows。操作系统如何准确地知道它何时到达文件末尾?是否有 EOF 字节或类似的东西?如果是这样,在其他平台上的实现是什么? (例如linux)
  • 我问这个是因为我想知道当我想截断它时是否可以简单地放那个字节。
【解决方案2】:

您认为跨平台功能如何运作?只需像这样制作自己的函数:

int truncate(int fd, long size)
{
#ifdef _WIN32 || _WIN64 
    return _chsize(fd, size);
#else
  #ifdef POSIX
    return ftruncate(fd, size);
  #else
    // code for other OSes
  #endif
#endif
}

【讨论】:

    【解决方案3】:

    Boost.Filesystem 库(1.44 及更高版本)提供了一个resize_file 函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-04
      相关资源
      最近更新 更多