Function makePath [src]
Calls makeDir iteratively to make an entire path
(i.e. creating any parent directories that do not exist).
Returns success if the path already exists and is a directory.
This function is not atomic, and if it returns an error, the file system may
have been modified regardless.
On Windows, sub_path should be encoded as WTF-8.
On WASI, sub_path should be encoded as valid UTF-8.
On other platforms, sub_path is an opaque sequence of bytes with no particular encoding.
Paths containing .. components are handled differently depending on the platform:
On Windows, .. are resolved before the path is passed to NtCreateFile, meaning
a sub_path like "first/../second" will resolve to "second" and only a
./second directory will be created.
On other platforms, .. are not resolved before the path is passed to mkdirat,
meaning a sub_path like "first/../second" will create both a ./first
and a ./second directory.
Prototype
pub fn makePath(self: Dir, sub_path: []const u8) (MakeError || StatFileError)!void
Parameters
self: Dir
sub_path: []const u8
Source
pub fn makePath(self: Dir, sub_path: []const u8) (MakeError || StatFileError)!void {
var it = try fs.path.componentIterator(sub_path);
var component = it.last() orelse return;
while (true) {
self.makeDir(component.path) catch |err| switch (err) {
error.PathAlreadyExists => {
// stat the file and return an error if it's not a directory
// this is important because otherwise a dangling symlink
// could cause an infinite loop
check_dir: {
// workaround for windows, see https://github.com/ziglang/zig/issues/16738
const fstat = self.statFile(component.path) catch |stat_err| switch (stat_err) {
error.IsDir => break :check_dir,
else => |e| return e,
};
if (fstat.kind != .directory) return error.NotDir;
}
},
error.FileNotFound => |e| {
component = it.previous() orelse return e;
continue;
},
else => |e| return e,
};
component = it.next() orelse return;
}
}