【问题标题】:WINAPI - Empty a file?WINAPI - 清空文件?
【发布时间】:2013-09-11 12:27:13
【问题描述】:

我想清空一个文件,我有两种方法:

1) 使用带有 dwCreationDisposition = TRUNCATE_EXISTING 的 CreateFile 函数!

2) 打开文件,用SetFilePointerEx设置文件指针指向文件开头,然后调用SetEndOfFile!

有什么区别,我应该使用哪一个?

【问题讨论】:

  • 第三种方式怎么样:ofstream x("C:\\file.txt", ios_base::trunc);
  • @MM。 ofstreams 缺少很多 CreateFile 所提供的功能(例如 FILE_FLAG_DELETE_ON_CLOSEFILE_FLAG_OVERLAPPED)。与CreateFile 相比,ofstream 通过异常报告错误。这既不好也不坏,但肯定是不同的。
  • @IInspectable:选择这种方式的主要原因是编写可移植的代码(但是 OP 肯定谈到了 Windows)。
  • @MM。我不介意便携性。以可移植性为目标通常是一件好事。但是,在处理文件/文件系统时,通常不是。例如,您的替代解决方案不支持 UNICODE 文件名。这是一个真正的交易障碍。

标签: c++ c file winapi


【解决方案1】:

本质上,这两者都将实现相同的目标,并且您必须对文件进行大量“清空”才能分辨出性能上的很大差异 - 如果文件很大,则释放不再使用的块无论如何,文件分配将是主要时间。

当然,如果您想要更便携的代码,使用ofstream of("myfile.ext"); 也可以实现这一点,FILE *f = fopen("myfile.ext", "w"); 也可以实现这一点(以及同一主题的一些变体)。

总的来说,这些变体之间几乎没有什么区别,这主要是对您当前正在处理的代码最有意义的情况。换句话说,“你接下来要对现在空的文件做什么”,以及你可能需要什么样的“句柄”。

【讨论】:

  • 谢谢!这就是我一直在寻找的答案!
  • @HMVC - 现在礼貌的做法是接受答案。
  • 这个答案没有回答问题。
【解决方案2】:

将 CreateFile 函数与 dwCreationDisposition = TRUNCATE_EXISTING 一起使用!

  • 这将打开一个现有文件并丢弃现有内容,使文件大小为 0。
  • 如果文件不存在,此方法将失败。
  • 这可以理解为删除现有文件并创建一个新文件,尽管技术上可能不正确。

打开文件并将文件指针设置为SetFilePointerEx的文件开头,然后调用SetEndOfFile

  • 打开文件并保留文件内容。
  • 无论文件是否存在,此方法都有效。
    文件是否已经存在完全留给dwCreationDisposition标志。
  • 假设您打开了一个包含以下内容的文件:
    0123456789
    并写zxc,这就是文件现在的样子:
    zxc3456789

我坚信他们应该允许 TRUNCATE_EXISTINGOPEN_ALWAYS 的组合以更好地处理指定的情况。

【讨论】:

  • 我想知道这如何比我的回答更好地回答“使用哪个”?
猜你喜欢
  • 1970-01-01
  • 2015-09-02
  • 1970-01-01
  • 1970-01-01
  • 2018-06-27
  • 1970-01-01
  • 2018-10-19
  • 2019-11-18
  • 1970-01-01
相关资源
最近更新 更多