【问题标题】:Why does openFile with WriteMode truncate the file? How not to?为什么以写入模式打开文件会截断文件?怎么不呢?
【发布时间】:2018-07-25 06:38:15
【问题描述】:

Haskell 的openFile 源码中有这个花絮:

-- we want to truncate() if this is an open in WriteMode, but only
-- if the target is a RegularFile.  ftruncate() fails on special files
-- like /dev/null.
when (iomode == WriteMode && fd_type == RegularFile) $
  setSize fD 0

这非常令人惊讶,我认为 IOModes 只是 O_WRONLYO_RDONLYO_RDWR 的包装。为什么会这样?如何打开一个只写而不截断的文件?

【问题讨论】:

  • 是的,这就是O_WRONLY 的意思。打开用于写入的文件和打开用于附加的文件之间的区别比 Haskell 早了很多,并且定义在比任何一种编程语言的语义都低的级别。

标签: haskell


【解决方案1】:

我认为IOMode 的设计类似于fopen 函数中的mode 参数。

来自man fopen

w - 将文件截断为零长度或创建文本文件以进行写入。流位于文件的开头。

如果你想打开一个只用于写入的文件(不截断它),那么你通常想附加它。所以只需使用AppendMode。如果您不想在文件末尾有位置(通常也不希望在文件开头有位置),您可以使用hSeek 来更改它。

【讨论】:

  • 这似乎是合法的。有趣的是,没有任何方法可以在不截断的情况下只打开写入。
【解决方案2】:

IO 模式 AppendModeReadWriteMode 应该打开文件进行写入而不截断它。

【讨论】:

  • 是的,但 ReadWriteMode 需要读取权限。我只想写。
猜你喜欢
  • 2015-01-03
  • 2023-03-07
  • 2020-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多