commit 5955ba4f53d2bf90093417f6eb4967cec1eeb3e5 (tree)
parent 720cd43fc14cc7e362b3a0bfb6d4b86b3de82299
Author: Andrew Kelley <andrew@ziglang.org>
Date: Mon, 7 Jul 2025 23:09:14 -0700
std.fs.File.Writer: implement positional writing for Windows
Diffstat:
1 file changed, 45 insertions(+), 17 deletions(-)
diff --git a/lib/std/fs/File.zig b/lib/std/fs/File.zig
@@ -1665,32 +1665,60 @@ pub const Writer = struct {
const handle = w.file.handle;
const buffered = io_w.buffered();
if (is_windows) switch (w.mode) {
- .positional, .positional_reading => @panic("TODO"),
+ .positional, .positional_reading => {
+ if (buffered.len != 0) {
+ const n = windows.WriteFile(handle, buffered, w.pos) catch |err| {
+ w.err = err;
+ return error.WriteFailed;
+ };
+ w.pos += n;
+ return io_w.consume(n);
+ }
+ for (data[0 .. data.len - 1]) |buf| {
+ if (buf.len == 0) continue;
+ const n = windows.WriteFile(handle, buf, w.pos) catch |err| {
+ w.err = err;
+ return error.WriteFailed;
+ };
+ w.pos += n;
+ return io_w.consume(n);
+ }
+ const pattern = data[data.len - 1];
+ if (pattern.len == 0 or splat == 0) return 0;
+ const n = windows.WriteFile(handle, pattern, w.pos) catch |err| {
+ w.err = err;
+ return error.WriteFailed;
+ };
+ w.pos += n;
+ return io_w.consume(n);
+ },
.streaming, .streaming_reading => {
- var i: usize = 0;
- while (i < buffered.len) {
- const n = windows.WriteFile(handle, buffered[i..], null) catch |err| {
+ if (buffered.len != 0) {
+ const n = windows.WriteFile(handle, buffered, null) catch |err| {
w.err = err;
- w.pos += i;
- _ = io_w.consume(i);
return error.WriteFailed;
};
- i += n;
- if (data.len > 0 and buffered.len - i < n) {
- w.pos += i;
- return io_w.consume(i);
- }
+ w.pos += n;
+ return io_w.consume(n);
}
- if (i != 0 or data.len == 0 or (data.len == 1 and splat == 0)) {
- w.pos += i;
- return io_w.consume(i);
+ for (data[0 .. data.len - 1]) |buf| {
+ if (buf.len == 0) continue;
+ const n = windows.WriteFile(handle, buf, null) catch |err| {
+ w.err = err;
+ return error.WriteFailed;
+ };
+ w.pos += n;
+ return io_w.consume(n);
}
- const n = windows.WriteFile(handle, data[0], null) catch |err| {
+ const pattern = data[data.len - 1];
+ if (pattern.len == 0 or splat == 0) return 0;
+ const n = windows.WriteFile(handle, pattern, null) catch |err| {
+ std.debug.print("windows write file failed3: {t}\n", .{err});
w.err = err;
- return 0;
+ return error.WriteFailed;
};
w.pos += n;
- return n;
+ return io_w.consume(n);
},
.failure => return error.WriteFailed,
};