rksoftware

Visual Studio とか C# とかが好きです

ファイルを同時に読んで書いてしてみる

概要

冒頭のリンクの中の 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.)