普通文件写入通常会先截断再重写目标文件,读取方可能看到半写入内容, 程序崩溃也可能留下不完整的目标文件。std.Io.File.Atomic 会先将新内容 写入临时文件,再通过重命名替换目标,因此读取方看到的始终是旧的完整文件 或新的完整文件。配置文件、生成数据等要求内容保持一致的场景适合使用这种方式。

//! Write a temporary file and atomically replace the destination.

const std = @import("std");

pub fn main(init: std.process.Init) !void {
    const io = init.io;
    const destination = "zig-cookbook-atomic.txt";
    var atomic = try std.Io.Dir.cwd().createFileAtomic(io, destination, .{ .replace = true });
    defer atomic.deinit(io);
    var buffer: [1024]u8 = undefined;
    var writer = atomic.file.writer(io, &buffer);
    try writer.interface.writeAll("all bytes are written before commit\n");
    try writer.interface.flush();
    try atomic.replace(io);
    defer std.Io.Dir.cwd().deleteFile(io, destination) catch {};
    std.debug.print("atomically replaced {s}\n", .{destination});
}