普通文件写入通常会先截断再重写目标文件,读取方可能看到半写入内容, 程序崩溃也可能留下不完整的目标文件。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});
}