EDITED by @stephentoub on 4/21/2024:
Exact same shape as existing APIs that take byte[]/string, just taking ReadOnlySpan<byte/char> instead for sync and ReadOnlyMemory<byte/char> for async.
public static class File
{
+ public static void WriteAllBytes(string path, ReadOnlySpan<byte> bytes);
+ public static Task WriteAllBytesAsync(string path, ReadOnlyMemory<byte> bytes, CancellationToken cancellationToken = default);
+ public static void WriteAllText(string path, ReadOnlySpan<char> contents);
+ public static void WriteAllText(string path, ReadOnlySpan<char> contents, Encoding encoding);
+ public static Task WriteAllTextAsync(string path, ReadOnlyMemory<byte> contents, CancellationToken cancellationToken = default);
+ public static Task WriteAllTextAsync(string path, ReadOnlyMemory<byte> contents, Encoding encoding, CancellationToken cancellationToken = default);
+ public static void AppendAllBytes(string path, ReadOnlySpan<byte> bytes);
+ public static Task AppendAllBytesAsync(string path, ReadOnlyMemory<byte> bytes, CancellationToken cancellationToken = default);
+ public static void AppendAllText(string path, ReadOnlySpan<char> contents);
+ public static void AppendAllText(string path, ReadOnlySpan<char> contents, Encoding encoding);
+ public static Task AppendAllTextAsync(string path, ReadOnlyMemory<char> contents, CancellationToken cancellationToken = default);
+ public static Task AppendAllTextAsync(string path, ReadOnlyMemory<char> contents, Encoding encoding, CancellationToken cancellationToken = default);
}
Background and motivation
Today, File.ReadAllBytes takes byte[] representing the bytes. It would be good to have an overload that takes ReadOnlySpan (sync ReadAllBytes) and ReadOnlyMemory (async ReadAllBytesAsync)
API Proposal
namespace System.IO;
public static class File
{
public static void WriteAllBytes(string path, ReadOnlySpan<byte> bytes);
public static void WriteAllBytes(string path, ReadOnlyMemory<byte> bytes);
public static Task WriteAllBytesAsync(string path, ReadOnlyMemory<byte> bytes, CancellationToken cancellationToken = default);
public static void AppendAllBytes(string path, ReadOnlySpan<byte> bytes);
public static void AppendAllBytes(string path, ReadOnlyMemory<byte> bytes);
public static Task AppendAllBytesAsync(string path, ReadOnlyMemory<byte> bytes, CancellationToken cancellationToken = default);
}
API Usage
File.WriteAllBytes(path, "Hello World!"u8);
Alternative Designs
Risks
No response
EDITED by @stephentoub on 4/21/2024:
Exact same shape as existing APIs that take
byte[]/string, just takingReadOnlySpan<byte/char>instead for sync andReadOnlyMemory<byte/char>for async.public static class File { + public static void WriteAllBytes(string path, ReadOnlySpan<byte> bytes); + public static Task WriteAllBytesAsync(string path, ReadOnlyMemory<byte> bytes, CancellationToken cancellationToken = default); + public static void WriteAllText(string path, ReadOnlySpan<char> contents); + public static void WriteAllText(string path, ReadOnlySpan<char> contents, Encoding encoding); + public static Task WriteAllTextAsync(string path, ReadOnlyMemory<byte> contents, CancellationToken cancellationToken = default); + public static Task WriteAllTextAsync(string path, ReadOnlyMemory<byte> contents, Encoding encoding, CancellationToken cancellationToken = default); + public static void AppendAllBytes(string path, ReadOnlySpan<byte> bytes); + public static Task AppendAllBytesAsync(string path, ReadOnlyMemory<byte> bytes, CancellationToken cancellationToken = default); + public static void AppendAllText(string path, ReadOnlySpan<char> contents); + public static void AppendAllText(string path, ReadOnlySpan<char> contents, Encoding encoding); + public static Task AppendAllTextAsync(string path, ReadOnlyMemory<char> contents, CancellationToken cancellationToken = default); + public static Task AppendAllTextAsync(string path, ReadOnlyMemory<char> contents, Encoding encoding, CancellationToken cancellationToken = default); }Background and motivation
Today, File.ReadAllBytes takes byte[] representing the bytes. It would be good to have an overload that takes ReadOnlySpan (sync ReadAllBytes) and ReadOnlyMemory (async ReadAllBytesAsync)
API Proposal
API Usage
Alternative Designs
Risks
No response