To jest trudno odpowiedzieć, ponieważ istnieje jeszcze wiele szczegółów z aplikacji, które nie zostały wymienione, ale myślę, że zarówno Guffa i odpowiedzi Amer są nadal częściowo słuszne:
- MemoryMappedFile jest więcej pamięci niż plik; jest to sekwencja stron o wielkości 4 KB w pamięci. Zatem stream.Length da ci wszystkie bajty (nie ma "wewnętrznego rozmiaru bufora"), ale może dać ci więcej bajtów, niż się spodziewasz, ponieważ rozmiar zawsze będzie zaokrąglany do granicy 4Kb.
- Semantyzm "plikowy" pochodzi z powiązania pliku MemoryMappedFile z rzeczywistym plikiem systemu plików. Zakładając, że proces, który tworzy plik, zawsze dostosowuje rozmiar pliku, możesz uzyskać dokładny rozmiar pliku za pośrednictwem fileSystem.
Jeżeli wszystkie powyższe pasowałby swoją aplikację, a następnie dodaje powinno działać:
static byte[] ReadMemoryMappedFile(string fileName)
{
long length = new FileInfo(fileName).Length;
using (var stream = File.Open(fileName, FileMode.OpenOrCreate, FileAccess.Read, FileShare.ReadWrite))
{
using (var mmf = MemoryMappedFile.CreateFromFile(stream, null, length, MemoryMappedFileAccess.Read, null, HandleInheritability.Inheritable, false))
{
using (var viewStream = mmf.CreateViewStream(0, length, MemoryMappedFileAccess.Read))
{
using (BinaryReader binReader = new BinaryReader(viewStream))
{
var result = binReader.ReadBytes((int)length);
return result;
}
}
}
}
}
Aby zapisać dane, można użyć to:
private static void WriteData(string fileName, byte[] data)
{
using (var stream = File.Open(fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite))
{
using (var mmf = MemoryMappedFile.CreateFromFile(stream, null, data.Length, MemoryMappedFileAccess.ReadWrite, null, HandleInheritability.Inheritable, true))
{
using (var view = mmf.CreateViewAccessor())
{
view.WriteArray(0, data, 0, data.Length);
}
}
stream.SetLength(data.Length); // Make sure the file is the correct length, in case the data got smaller.
}
}
Ale przez czas, w którym wykonujesz wszystkie powyższe czynności, możesz równie dobrze wykorzystać plik bezpośrednio i uniknąć mapowania pamięci. Jeśli mapowanie go do systemu plików jest niedopuszczalne, odpowiedź Guffy na kodowanie długości (lub markera końcowego) w samych danych jest prawdopodobnie najlepsza.
nie widzę tego jako ważnego pytanie ... po prostu jak firmware rozmiarze pasującym do regionów pamięci dane muszą mieścić się wewnątrz wyznaczony powierzchnia. Masz rozmiar utworzonego pliku, jeśli nie masz tego rozmiaru, to musisz go dostarczyć lub znać przed rozpoczęciem pracy z plikiem przez abstrakcję lub API. Można także utworzyć nagłówek w pliku odwzorowanym w pamięci, aby wskazać długość i bieżące przesunięcie, jeśli jest to wymagane. Na przykład, jeśli rozmiar pliku jest mniejszy niż rozmiar strony i piszę do obszaru po twoim rozmiarze .. – Jay