函数

GLibfile_set_contents_full

自:2.66

声明 [源代码]

gboolean
g_file_set_contents_full (
  const gchar* filename,
  const gchar* contents,
  gssize length,
  GFileSetContentsFlags flags,
  int mode,
  GError** error
)

说明 [源代码]

使用出色的错误检查,将 contents 全部写入名为 filename 的文件。如果文件 filename 已存在,它会被覆盖。

flags 控制写入操作的属性:它是否是原子的,以及在快速返回或对系统崩溃具有复原能力之间进行权衡。

由于此函数执行文件 I/O,因此建议不要在任何会导致问题的地方调用它,例如在图形应用程序的主循环中。特别是,如果 flags 具有除 G_FILE_SET_CONTENTS_NONE 之外的任何值,此函数可能会调用 fsync()

如果在 flags 中设置了 G_FILE_SET_CONTENTS_CONSISTENT,则操作则具有原子性,因为它首先写入到一个临时文件,然后重命名为最终文件名。

注意

  • UNIX 中,如果 filename 已存在,则对 filename 的硬链接将会断开。此外,由于该文件已重新创建,因此现有的权限、访问控制列表和元数据等内容可能会丢失。如果 filename 是符号链接,则该链接本身将被替换,而不是链接的文件。

  • UNIX 中,如果 filename 已存在且非空,并且如果系统支持(通过日志记录文件系统或等效项),并且如果在 flags 中设置了 G_FILE_SET_CONTENTS_CONSISTENT,则 fsync() 调用(或等效调用)将用于确保原子替换:无论系统电源中断、磁盘被不安全地移除等情况,filename 都将包含其旧内容或 contents

  • UNIX 中,如果 filename 尚未存在或为空,则在调用此函数后系统断电等情况可能会使 filename 为空或充满 NUL 字节,具体取决于底层文件系统,除非在 flags 中设置了 G_FILE_SET_CONTENTS_DURABLEG_FILE_SET_CONTENTS_CONSISTENT

  • 在 Windows 中,重命名文件不会移除具有新名称的现有文件,所以在 Windows 中,现有文件被移除和临时文件被重命名的操作之间存在竞争条件。

  • 在 Windows 中,无法移除对某些进程打开或映射到内存中的文件。因此,如果 filename 已存在且处于打开状态,则此函数会失败。

如果调用成功,则返回 TRUE。如果调用不成功,则返回 FALSE 并设置 error。错误域为 G_FILE_ERROR。可能的错误代码为 GFileError 枚举中的错误代码。

请注意,临时文件名称是通过向 filename 追加最多 7 个字符来构建的。

如果文件之前不存在且被创建,它将获得 mode 中的权限。否则,现有文件的权限可能会根据 flags 更改为 mode,或者可能会保持不变。

从 2.66 开始提供

参数

filename

类型: const gchar*

要写入 contents 的文件的名称,采用 GLib 文件名编码。

数据归函数调用者所有。
该值是平台原生字符串,在 Unix 上使用首选操作系统编码,在 Windows 上使用 UTF-8。
contents

类型: guint8 的数组

要写入文件的字符串。

数组的长度在 length 参数中指定。
数据归函数调用者所有。
length

类型: gssize

contents 的长度,如果 contents 是以 null 结尾的字符串,则为 -1。

flags

类型: GFileSetContentsFlags

控制操作安全性与速度的标志。

mode

类型: int

文件模式,传递给 open();通常为 0666

error

类型: GError **

一个可恢复错误的返回位置 (recoverable error)

该参数可以为 NULL
如果返回位置不是 NULL,则必须将其初始化为 NULL GError*
如果不存在任何错误,此参数的初始化将由该函数保留为 NULL
如果出错,此参数将设置为新分配的 GError;调用方将拥有数据的所属权,并负责释放它。

返回值

类型: gboolean

如果成功,则返回 TRUE;如果发生错误,则返回 FALSE