3 Ocak 2017 Salı

MemoryMappedFile Sınıfı

MemoryMappedFile Sınıfı
MemoryMappedFile her zaman using ile kullanılır.

CreateFromFile metodu - FileStream
Belirtilen stream belleğe yüklenir. Belleğe Map ismini verilir. Şöyle yaparız.
using (FileStream stream = new FileStream(...))
using (var mmf = MemoryMappedFile.CreateFromFile(stream, "Map", size, 
MemoryMappedFileAccess.ReadWrite, null, HandleInheritability.None, true))
{...}
Dosyadan yüklemek için şöyle yaparız.
using (var mmf = MemoryMappedFile.CreateFromFile(@"a.data", FileMode.Open,"Map"))
{...}
CreateFromFile metodu - String
Şöyle yaparız.
var filePath = @"D:\test.txt";
var fileSize = new FileInfo(filePath).Length;
var viewSize = fileSize

using (var mm = MemoryMappedFile.CreateFromFile(filePath,
  FileMode.Open, null, 0, MemoryMappedFileAccess.Read))
using (var stream = mm.CreateViewStream(0, viewSize, MemoryMappedFileAccess.Read))
using (var reader = new StreamReader(stream, Encoding.UTF8))
{
    reader.ReadLine();
}
CreateViewAccessor metodu
Dosyanın belli bir kısmına MemoryMappedViewAccesssor (byte dizisi) şeklinde erişim imkanı tanır. Şöyle yaparız.
long offset = 0x10000000; // 256 megabytes 
long length = 0x20000000; // 512 megabytes 

// Create a random access view, from the 256th megabyte (the offset) 
// to the 768th megabyte (the offset plus length). 
using (var accessor = mmf.CreateViewAccessor(offset, length))
{
  ...
}
CreateViewStream metodu
Accessor yerine MemoryMappedViewStream olarak tüm belleğe erişim sağlar. Şöyle yaparız.
byte[] fileBytes = ...;
var viewStream = mmf.CreateViewStream();
viewStream.Write(fileBytes, 0, fileBytes.Length); 
OpenExisting metodu
İsmini bildiğimiz bir bellek alanına erişim sağlar. Şöyle yapılır.
// Assumes another process has created the memory-mapped file. 
using (var mmf = MemoryMappedFile.OpenExisting("ImgA"))
{
  using (var accessor = mmf.CreateViewAccessor(4000000, 2000000))
  {...}
}
MemoryMappedViewAccessor Sınıfı
Read ve Write metodları
mmf açıkdıktan sonra büyüklüğünü bildiğimiz nesneler şöyle okunur.
int colorSize = Marshal.SizeOf(typeof(MyColor));
MyColor color;

// Make changes to the view. 
for (long i = 0; i < length; i += colorSize)
{
  accessor.Read(i, out color);
  color.Brighten(10);
  accessor.Write(i, ref color);
}






Hiç yorum yok:

Yorum Gönder