zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit b9a6dae2ae68d74d7f2fc2bfe394eb506fb7ca69 (tree)
parent e667884f9ba21c7cdec7581d89b9a9f622c5ffb9
Author: Andrew Kelley <andrew@ziglang.org>
Date:   Sun, 10 Aug 2025 17:44:30 -0700

std.fs.File.Reader.getSize: check file kind on stat

closes #24794

Diffstat:
Mlib/std/fs/File.zig | 22++++++++++++++++++----
Mlib/std/tar/Writer.zig | 2+-
Mlib/std/zip.zig | 2+-
3 files changed, 20 insertions(+), 6 deletions(-)

diff --git a/lib/std/fs/File.zig b/lib/std/fs/File.zig @@ -1202,12 +1202,26 @@ pub const Reader = struct { }; } - pub fn getSize(r: *Reader) GetEndPosError!u64 { + pub fn getSize(r: *Reader) SizeError!u64 { return r.size orelse { if (r.size_err) |err| return err; - if (r.file.getEndPos()) |size| { - r.size = size; - return size; + if (is_windows) { + if (windows.GetFileSizeEx(r.file.handle)) |size| { + r.size = size; + return size; + } else |err| { + r.size_err = err; + return err; + } + } + if (stat(r.file)) |st| { + if (st.kind == .file) { + r.size = st.size; + return st.size; + } else { + r.size_err = error.Streaming; + return error.Streaming; + } } else |err| { r.size_err = err; return err; diff --git a/lib/std/tar/Writer.zig b/lib/std/tar/Writer.zig @@ -36,7 +36,7 @@ pub fn writeDir(w: *Writer, sub_path: []const u8, options: Options) Error!void { try w.writeHeader(.directory, sub_path, "", 0, options); } -pub const WriteFileError = std.Io.Writer.FileError || Error || std.fs.File.GetEndPosError; +pub const WriteFileError = std.Io.Writer.FileError || Error || std.fs.File.Reader.SizeError; pub fn writeFile( w: *Writer, diff --git a/lib/std/zip.zig b/lib/std/zip.zig @@ -115,7 +115,7 @@ pub const EndRecord = extern struct { return record; } - pub const FindFileError = File.GetEndPosError || File.SeekError || File.ReadError || error{ + pub const FindFileError = File.Reader.SizeError || File.SeekError || File.ReadError || error{ ZipNoEndRecord, EndOfStream, ReadFailed,