v4-MemoryMappedFile - IOException by Flush

26/04/2010 - 14:03 von Markus Springweiler | Report spam
Hallo,

using (var fs = new FileStream(Path.GetTempFileName(), FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite, 4096, FileOptions.RandomAccess | FileOptions.DeleteOnClose))
using (var mmf = MemoryMappedFile.CreateFromFile(fs, null, 1024 * 1024 * 500, MemoryMappedFileAccess.ReadWrite, null, HandleInheritability.None, true))
using (var view = mmf.CreateViewAccessor())
{
view.Write(view.Capacity - 1, (byte)255);
view.Flush();
}

Bei Flush() kracht es sofort mit einer IOException "Der Prozess kann nicht
auf die Datei zugreifen, da ein anderer Prozess einen Teil der Datei
gesperrt hat.".

Aber was soll das?

Übrigens funktioniert es, wenn Flush() so lange wiederholt aufgerufen wird,
bis die Festplatte fertig ist -- ich vermute, SSD-Besitzer werden erst gar
keine Probleme dabei bekommen.

/\/\arkus.
 

Lesen sie die antworten

#1 Thomas Scheidegger
26/04/2010 - 15:49 | Warnen spam
Hallo Markus

MemoryMappedFile.CreateFromFile(fs, null, 1024 * 1024 * 500,
view.Flush(); ...IOException "Der Prozess kann nicht auf die Datei
zugreifen, da ein anderer Prozess einen Teil der Datei gesperrt hat"



also = ERROR_LOCK_VIOLATION 33 (0x21)
http://www.google.com/#q=FlushViewO..._VIOLATION

ungeprüfte, mögliche Ursache:
CreateFileMapping
http://msdn.microsoft.com/en-us/lib...66537.aspx

"If the file is extended,
the contents of the file between the old end
of the file and the new end of the file
are not guaranteed to be zero;
the behavior is defined by the file system." <<<<

Evtl. wird die Datei von NTFS hier 'asynchron' mit 00 gefüllt,
was einige Zeit (ggf 'Sekunden') dauern kann,
womit möglicherweise die Problematik von
SetEndOfFile / SetFileValidData
http://msdn.microsoft.com/en-us/lib...65544.aspx
http://msdn.microsoft.com/en-us/lib...65531.aspx
mitspielt.
Müsste man evtl. erst mal auf Win32/C++ Ebene reproduzieren
und nach Lösungen (zB bestimmte Flags bei APIs) suchen...
Einige Google-hits erwàhnen gar ein mehrmaliges re-try von
FlushViewOfFile(),
was aber sicher die worst-case solution wàre.



Thomas Scheidegger - 'NETMaster'
http://dnetmaster.net/

Ähnliche fragen