aboutsummaryrefslogtreecommitdiff
path: root/lib/std/fs/File.zig
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2025-08-10 17:44:30 -0700
committerAndrew Kelley <andrew@ziglang.org>2025-08-10 17:51:22 -0700
commitb9a6dae2ae68d74d7f2fc2bfe394eb506fb7ca69 (patch)
treef9e29379e311211d8a6ae70a6f967cc8e1d563b1 /lib/std/fs/File.zig
parente667884f9ba21c7cdec7581d89b9a9f622c5ffb9 (diff)
downloadzig-b9a6dae2ae68d74d7f2fc2bfe394eb506fb7ca69.tar.gz
zig-b9a6dae2ae68d74d7f2fc2bfe394eb506fb7ca69.zip
std.fs.File.Reader.getSize: check file kind on stat
closes #24794
Diffstat (limited to 'lib/std/fs/File.zig')
-rw-r--r--lib/std/fs/File.zig22
1 files changed, 18 insertions, 4 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;