Commit b9a6dae2ae

Andrew Kelley <andrew@ziglang.org>
2025-08-11 02:44:30
std.fs.File.Reader.getSize: check file kind on stat
closes #24794
1 parent e667884
Changed files (3)
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;
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,
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,