概要
冒頭のリンクの中の Reading & Writing Files という項目が気になったので動かしてみました。
新しいファイル読み書きの API ですね。一つのファイルを並行で 3 処理で読み書きしでみました。
以前に読んでみただけの記事はこちら
読むために必要なもの
読むだけであれば handle の取得は
using SafeFileHandle handle = File.OpenHandle("test.txt");
と、ファイル名だけで良かったのですが、書き込みもするとなると引数 access: の指定が必要。
using SafeFileHandle handle = File.OpenHandle("test.txt", access: FileAccess.ReadWrite);
たったそれだけといえばそれだけでできてしまいます。
あとは、ReadAsync メソッドが WriteAsync メソッドですね。
var t2 = RandomAccess.ReadAsync(handle, buffer2, 1);
↓
var t2 = RandomAccess.WriteAsync(handle, buffer2, 1);
こっちは明らかにそれだけでできていいですね。
コード
コード
// OpenHandle で引数 access: の指定が必要 //using SafeFileHandle handle = File.OpenHandle("test.txt"); using SafeFileHandle handle = File.OpenHandle("test.txt", access: FileAccess.ReadWrite); var bytes1 = new byte[30]; // 書き込むデータを生成 //var bytes2 = new byte[2]; var bytes2 = "abcdefghijklmnopqrstuvwxyz".Select(c => (byte)c).ToArray(); var bytes3 = new byte[30]; var buffer1 = new Memory<byte>(bytes1); var buffer2 = new Memory<byte>(bytes2); var buffer3 = new Memory<byte>(bytes3); var t1 = RandomAccess.ReadAsync(handle, buffer1, 1); // Read でなく Write というメソッドを使う //var t2 = RandomAccess.ReadAsync(handle, buffer2, 1); var t2 = RandomAccess.WriteAsync(handle, buffer2, 1); var t3 = RandomAccess.ReadAsync(handle, buffer3, 1); Task.WaitAll(t1.AsTask(), t2.AsTask(), t3.AsTask()); Console.WriteLine(System.Text.Encoding.Default.GetString(bytes1)); Console.WriteLine(System.Text.Encoding.Default.GetString(bytes2)); Console.WriteLine(System.Text.Encoding.Default.GetString(bytes3));
※ 読み込みは 2 つに増やしています。
test.txt ファイル
12345678901234567890123456789012345678901234567890
実行結果
234567890123456789012345678901 abcdefghijklmnopqrstuvwxyz abcdefghijklmnopqrstuvwxyz8901
または
234567890123456789012345678901 abcdefghijklmnopqrstuvwxyz 234567890123456789012345678901
または
abcdefghijklmnopqrstuvwxyz8901 abcdefghijklmnopqrstuvwxyz abcdefghijklmnopqrstuvwxyz8901
計画通り! ちゃんと読み書きできています。コードもシンプルですしいいですね。static メソッドなのもポイントですね。
■ 補足
handle の取得で引数 access: を指定しないと次の例外です。
Unhandled exception. System.AggregateException: One or more errors occurred. (Access to the path '<ファイルのパス>' is denied.)