mirror of
https://github.com/ziglang/zig.git
synced 2025-12-06 06:13:07 +00:00
std.fs.File: prefer getSize over getEndPos
The former detects when it is appropriate to switch to streaming mode. closes #24798
This commit is contained in:
parent
60f8584927
commit
282c3575b1
@ -1219,6 +1219,7 @@ pub const Reader = struct {
|
||||
r.size = st.size;
|
||||
return st.size;
|
||||
} else {
|
||||
r.mode = r.mode.toStreaming();
|
||||
r.size_err = error.Streaming;
|
||||
return error.Streaming;
|
||||
}
|
||||
@ -1419,13 +1420,8 @@ pub const Reader = struct {
|
||||
const pos = r.pos;
|
||||
switch (r.mode) {
|
||||
.positional, .positional_reading => {
|
||||
const size = r.size orelse {
|
||||
if (file.getEndPos()) |size| {
|
||||
r.size = size;
|
||||
} else |err| {
|
||||
r.size_err = err;
|
||||
const size = r.getSize() catch {
|
||||
r.mode = r.mode.toStreaming();
|
||||
}
|
||||
return 0;
|
||||
};
|
||||
const delta = @min(@intFromEnum(limit), size - pos);
|
||||
@ -1472,14 +1468,7 @@ pub const Reader = struct {
|
||||
r.pos = pos + n;
|
||||
return n;
|
||||
}
|
||||
const size = r.size orelse {
|
||||
if (file.getEndPos()) |size| {
|
||||
r.size = size;
|
||||
} else |err| {
|
||||
r.size_err = err;
|
||||
}
|
||||
return 0;
|
||||
};
|
||||
const size = r.getSize() catch return 0;
|
||||
const n = @min(size - pos, maxInt(i64), @intFromEnum(limit));
|
||||
file.seekBy(n) catch |err| {
|
||||
r.seek_err = err;
|
||||
@ -1912,15 +1901,7 @@ pub const Writer = struct {
|
||||
var off: std.os.linux.off_t = undefined;
|
||||
const off_ptr: ?*std.os.linux.off_t, const count: usize = switch (file_reader.mode) {
|
||||
.positional => o: {
|
||||
const size = file_reader.size orelse {
|
||||
if (file_reader.file.getEndPos()) |size| {
|
||||
file_reader.size = size;
|
||||
} else |err| {
|
||||
file_reader.size_err = err;
|
||||
file_reader.mode = .streaming;
|
||||
}
|
||||
return 0;
|
||||
};
|
||||
const size = file_reader.getSize() catch return 0;
|
||||
off = std.math.cast(std.os.linux.off_t, file_reader.pos) orelse return error.ReadFailed;
|
||||
break :o .{ &off, @min(@intFromEnum(limit), size - file_reader.pos, max_count) };
|
||||
},
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user