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

closes #24794
This commit is contained in:
Andrew Kelley
2025-08-10 17:44:30 -07:00
parent e667884f9b
commit b9a6dae2ae
3 changed files with 20 additions and 6 deletions

View File

@@ -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;

View File

@@ -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,

View File

@@ -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,