为什么带有WriteMode的openFile会截断文件?怎么不呢?

时间:2018-07-25 06:38:16

标签: haskell

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

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

2 个答案:

答案 0 :(得分:4)

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

来自man fopen

  

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

如果您想打开一个仅用于写入的文件(不截断文件),则通常要附加它。因此,只需使用AppendMode。如果您不想在文件末尾放置位置(通常也不想在文件开始处放置位置),则可以使用hSeek进行更改。

答案 1 :(得分:1)

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