.NET 6’daki yenilikler [14]: Akış nesneleri olmadan doğrudan dosya erişimi

Womanne

Member
.NET 6’daki Yenilikler serisinin 14. Bölümü, sınıfla ilgilidir System.IO.RandomAccess.


.NET 6 yeni bir sınıf sunuyor System.IO.RandomAccess akış nesneleri ile önceki erişimlerden daha performanslı olan dosya sistemi erişimi için.

Aşağıdaki liste, ile bir dosya yazarken yeni sınıfın eylem halinde olduğunu gösterir. Write() ve okurken Read().

public static void FileIOWithoutStream()
{
var path = System.IO.Path.GetTempFileName();
#region ------- Dateiinhalte schreiben ohne Stream-Objekte
using (Microsoft.Win32.SafeHandles.SafeFileHandle handle
= File.OpenHandle(path, FileMode.Create,
FileAccess.Write))
{
var arr = new byte[100];
arr = Encoding.ASCII.GetBytes("1234567890abcdef" +
"1234567890abcdef1234567890abcdef" +
"1234567890abcdef1234567890abcdef" +
"1234567890abcdef1234567890abcdef" +
"1234567890abcdef1234567890abcdef");
int startpos = 00;
Span<byte> buffer = arr;

RandomAccess.Write(handle, buffer, startpos);

handle.Close();
}
#endregion

#region ------- Dateiinhalte lesen ohne Stream-Objekte
using (Microsoft.Win32.SafeHandles.SafeFileHandle handle
= File.OpenHandle(path))
{

// Dateilänge ermitteln
long length = RandomAccess.GetLength(handle);
Console.WriteLine(length);

// 100 Bytes einlesen, erste 10 Zeichen überspringen
var arr = new byte[100];
int startpos = 10;
Span<byte> buffer = arr;
var bytesRead = RandomAccess.Read(handle, buffer, startpos);

Console.WriteLine("Puffergröße: " + buffer.Length);
Console.WriteLine("Eingelesene Bytes: " + bytesRead);
Console.WriteLine("Inhalte an Position 1:"
+ (char)arr[0]); // a
Console.WriteLine("Inhalte an Position 11:"
+ (char)arr[10]); // 5
Console.WriteLine("Inhalte an Position 99:"
+ (char)arr[98]); // c

handle.Close();
}
#endregion
}


100 MB içerikli bir dosyanın sıralı yazımı için performans karşılaştırmasında RandomAccess.Write() Stream nesnelerini kullanmaktan daha hızlıdır, ancak WriteAllBytes() hala mevcut RandomAccess.Write().




100MB dosya yazarken hız



100MB dosya yazarken hız



Ne yazık ki, bu sadece kaynak kodunu okumak için zaman ayırırsanız, belgelere bakarak açıklanamaz. WriteAllBytes() .NET 6’da önceki uygulamaya (.NET 5) kıyasla. Sonra onu görüyorsun WriteAllBytes() dahili zaman System.IO.RandomAccess ve bu nedenle diğer işletim sistemi API’lerini de kullanır.




.NET 5 ve .NET 6'da WriteAllBytes()



.NET 5 ve .NET 6’da WriteAllBytes()




()



Haberin Sonu
 
Üst