authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-08-10 17:44:30-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-08-10 17:51:22-07:00
logb9a6dae2ae68d74d7f2fc2bfe394eb506fb7ca69
treef9e29379e311211d8a6ae70a6f967cc8e1d563b1
parente667884f9ba21c7cdec7581d89b9a9f622c5ffb9

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

closes #24794

3 files changed, 20 insertions(+), 6 deletions(-)

lib/std/fs/File.zig+18-4
......@@ -1202,12 +1202,26 @@ pub const Reader = struct {
12021202 };
12031203 }
12041204
1205 pub fn getSize(r: *Reader) GetEndPosError!u64 {
1205 pub fn getSize(r: *Reader) SizeError!u64 {
12061206 return r.size orelse {
12071207 if (r.size_err) |err| return err;
1208 if (r.file.getEndPos()) |size| {
1209 r.size = size;
1210 return size;
1208 if (is_windows) {
1209 if (windows.GetFileSizeEx(r.file.handle)) |size| {
1210 r.size = size;
1211 return size;
1212 } else |err| {
1213 r.size_err = err;
1214 return err;
1215 }
1216 }
1217 if (stat(r.file)) |st| {
1218 if (st.kind == .file) {
1219 r.size = st.size;
1220 return st.size;
1221 } else {
1222 r.size_err = error.Streaming;
1223 return error.Streaming;
1224 }
12111225 } else |err| {
12121226 r.size_err = err;
12131227 return err;
lib/std/tar/Writer.zig+1-1
......@@ -36,7 +36,7 @@ pub fn writeDir(w: *Writer, sub_path: []const u8, options: Options) Error!void {
3636 try w.writeHeader(.directory, sub_path, "", 0, options);
3737}
3838
39pub const WriteFileError = std.Io.Writer.FileError || Error || std.fs.File.GetEndPosError;
39pub const WriteFileError = std.Io.Writer.FileError || Error || std.fs.File.Reader.SizeError;
4040
4141pub fn writeFile(
4242 w: *Writer,
lib/std/zip.zig+1-1
......@@ -115,7 +115,7 @@ pub const EndRecord = extern struct {
115115 return record;
116116 }
117117
118 pub const FindFileError = File.GetEndPosError || File.SeekError || File.ReadError || error{
118 pub const FindFileError = File.Reader.SizeError || File.SeekError || File.ReadError || error{
119119 ZipNoEndRecord,
120120 EndOfStream,
121121 ReadFailed,