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: Dirsub_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; } }