From b9a6dae2ae68d74d7f2fc2bfe394eb506fb7ca69 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Sun, 10 Aug 2025 17:44:30 -0700 Subject: [PATCH] std.fs.File.Reader.getSize: check file kind on stat closes #24794 --- lib/std/fs/File.zig | 22 ++++++++++++++++++---- lib/std/tar/Writer.zig | 2 +- lib/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 index 969c35e6b1..437627629d 100644 --- 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 index 61ae00b24e..ab18674712 100644 --- 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 index 74ccde18f0..66485d862b 100644 --- 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,