authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-07-07 23:09:14-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-07-07 23:09:14-07:00
log5955ba4f53d2bf90093417f6eb4967cec1eeb3e5
tree91c00d1cacb117755739c160e2f4179576aa3b5d
parent720cd43fc14cc7e362b3a0bfb6d4b86b3de82299

std.fs.File.Writer: implement positional writing for Windows


1 files changed, 45 insertions(+), 17 deletions(-)

lib/std/fs/File.zig+45-17
...@@ -1665,32 +1665,60 @@ pub const Writer = struct {...@@ -1665,32 +1665,60 @@ pub const Writer = struct {
1665 const handle = w.file.handle;1665 const handle = w.file.handle;
1666 const buffered = io_w.buffered();1666 const buffered = io_w.buffered();
1667 if (is_windows) switch (w.mode) {1667 if (is_windows) switch (w.mode) {
1668 .positional, .positional_reading => @panic("TODO"),1668 .positional, .positional_reading => {
1669 if (buffered.len != 0) {
1670 const n = windows.WriteFile(handle, buffered, w.pos) catch |err| {
1671 w.err = err;
1672 return error.WriteFailed;
1673 };
1674 w.pos += n;
1675 return io_w.consume(n);
1676 }
1677 for (data[0 .. data.len - 1]) |buf| {
1678 if (buf.len == 0) continue;
1679 const n = windows.WriteFile(handle, buf, w.pos) catch |err| {
1680 w.err = err;
1681 return error.WriteFailed;
1682 };
1683 w.pos += n;
1684 return io_w.consume(n);
1685 }
1686 const pattern = data[data.len - 1];
1687 if (pattern.len == 0 or splat == 0) return 0;
1688 const n = windows.WriteFile(handle, pattern, w.pos) catch |err| {
1689 w.err = err;
1690 return error.WriteFailed;
1691 };
1692 w.pos += n;
1693 return io_w.consume(n);
1694 },
1669 .streaming, .streaming_reading => {1695 .streaming, .streaming_reading => {
1670 var i: usize = 0;1696 if (buffered.len != 0) {
1671 while (i < buffered.len) {1697 const n = windows.WriteFile(handle, buffered, null) catch |err| {
1672 const n = windows.WriteFile(handle, buffered[i..], null) catch |err| {
1673 w.err = err;1698 w.err = err;
1674 w.pos += i;
1675 _ = io_w.consume(i);
1676 return error.WriteFailed;1699 return error.WriteFailed;
1677 };1700 };
1678 i += n;1701 w.pos += n;
1679 if (data.len > 0 and buffered.len - i < n) {1702 return io_w.consume(n);
1680 w.pos += i;
1681 return io_w.consume(i);
1682 }
1683 }1703 }
1684 if (i != 0 or data.len == 0 or (data.len == 1 and splat == 0)) {1704 for (data[0 .. data.len - 1]) |buf| {
1685 w.pos += i;1705 if (buf.len == 0) continue;
1686 return io_w.consume(i);1706 const n = windows.WriteFile(handle, buf, null) catch |err| {
1707 w.err = err;
1708 return error.WriteFailed;
1709 };
1710 w.pos += n;
1711 return io_w.consume(n);
1687 }1712 }
1688 const n = windows.WriteFile(handle, data[0], null) catch |err| {1713 const pattern = data[data.len - 1];
1714 if (pattern.len == 0 or splat == 0) return 0;
1715 const n = windows.WriteFile(handle, pattern, null) catch |err| {
1716 std.debug.print("windows write file failed3: {t}\n", .{err});
1689 w.err = err;1717 w.err = err;
1690 return 0;1718 return error.WriteFailed;
1691 };1719 };
1692 w.pos += n;1720 w.pos += n;
1693 return n;1721 return io_w.consume(n);
1694 },1722 },
1695 .failure => return error.WriteFailed,1723 .failure => return error.WriteFailed,
1696 };1724 };