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 {...@@ -1202,12 +1202,26 @@ pub const Reader = struct {
1202 };1202 };
1203 }1203 }
12041204
1205 pub fn getSize(r: *Reader) GetEndPosError!u64 {1205 pub fn getSize(r: *Reader) SizeError!u64 {
1206 return r.size orelse {1206 return r.size orelse {
1207 if (r.size_err) |err| return err;1207 if (r.size_err) |err| return err;
1208 if (r.file.getEndPos()) |size| {1208 if (is_windows) {
1209 r.size = size;1209 if (windows.GetFileSizeEx(r.file.handle)) |size| {
1210 return 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 }
1211 } else |err| {1225 } else |err| {
1212 r.size_err = err;1226 r.size_err = err;
1213 return err;1227 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 {...@@ -36,7 +36,7 @@ pub fn writeDir(w: *Writer, sub_path: []const u8, options: Options) Error!void {
36 try w.writeHeader(.directory, sub_path, "", 0, options);36 try w.writeHeader(.directory, sub_path, "", 0, options);
37}37}
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
41pub fn writeFile(41pub fn writeFile(
42 w: *Writer,42 w: *Writer,
lib/std/zip.zig+1-1
...@@ -115,7 +115,7 @@ pub const EndRecord = extern struct {...@@ -115,7 +115,7 @@ pub const EndRecord = extern struct {
115 return record;115 return record;
116 }116 }
117117
118 pub const FindFileError = File.GetEndPosError || File.SeekError || File.ReadError || error{118 pub const FindFileError = File.Reader.SizeError || File.SeekError || File.ReadError || error{
119 ZipNoEndRecord,119 ZipNoEndRecord,
120 EndOfStream,120 EndOfStream,
121 ReadFailed,121 ReadFailed,