Zig NEWS

LI Yu
LI Yu

Posted on • Updated on

`tmpfile.zig`, a reusable utility for using tmp files in sys tmp

As titled, a simple but convenient lib for creating tmp dir/tmp file in system tmp folder.

So far I can not found in std about how to do this. There is one std.testing.TmpDir, and after reading the src code, it actually creates the tmp files in zig-cache (which makes sense). Then how about the usual task of creating tmp files in system tmp folder like /tmp?

So here is tmpfile.zig

GitHub logo liyu1981 / tmpfile.zig

a convenient util to use tmp files with zig

tmpfile.zig

why

So far as I found there is no good lib in zig for creating temp files, so I write one for myself. This util file provides methods to create temp dir or temp file in system temp folder less tedious and manageable.

see code for example

var tmp_file = try ThisModule.tmpFile(.{});
defer tmp_file.deinit(); // file will be deleted when deinit
try tmp_file.f.writeAll("hello, world!");
try tmp_file.f.seekTo(0);
var buf: [4096]u8 = undefined;
var read_count = try tmp_file.f.readAll(&buf);
try testing.expectEqual(read_count, "hello, world!".len);
try testing.expectEqualSlices(u8, buf[0..read_count], "hello, world!");
Enter fullscreen mode Exit fullscreen mode

or complexer

var tmp_dir = try ThisModule.tmpDirOwned(.{})
defer {
    tmp_dir.
Enter fullscreen mode Exit fullscreen mode

Simple usage is like

var tmp_dir = try ThisModule.tmpDirOwned(.{});
defer {
    tmp_dir.deinit();
    tmp_dir.allocator.destroy(tmp_dir);
}

var tmp_file = try tmpfile.tmpFile(.{ .tmp_dir = tmp_dir });
defer tmp_file.deinit();
try tmp_file.f.writeAll("hello, world!");
try tmp_file.f.seekTo(0);
var buf: [4096]u8 = undefined;
var read_count = try tmp_file.f.readAll(&buf);
try testing.expectEqual(read_count, "hello, world!".len);
try testing.expectEqualSlices(u8, buf[0..read_count], "hello, world!");

var tmp_file2 = try tmpfile.tmpFile(.{ .tmp_dir = tmp_dir });
defer tmp_file2.deinit();
try tmp_file2.f.writeAll("hello, world!2");
try tmp_file2.f.seekTo(0);
read_count = try tmp_file2.f.readAll(&buf);
try testing.expectEqual(read_count, "hello, world!2".len);
try testing.expectEqualSlices(u8, buf[0..read_count], "hello, world!2");
Enter fullscreen mode Exit fullscreen mode

It can be used as normal zig packages, or used in build.zig file as it has exposed itself. Or simply you can just copy the tmpfile.zig file over for using it. It is a simple util, so make it simle with your project :).

Top comments (0)