beim Testen von MemoryMappedFiles-Funktionen bekomme ich folgenden Fehler:
Der Typ "string" darf keine NULL-Werte zulassen, wenn er als T-Parameter im generischen Typ oder in der generischen Methode "System.IO.UnmanagedMemoryAccessor.WriteArray<T>(long, T[], int, int)" verwendet werden soll.
Das ist der Codeausschnit, der den Fehler verursacht:
using (MemoryMappedFile mmf = MemoryMappedFile.CreateOrOpen(_MMFName, 1024)) { using (MemoryMappedViewAccessor mmva = mmf.CreateViewAccessor()) { string[] namen = new string[] {"Hans", @"C:\Test\Versuch\Probe.TXT"}; mmva.WriteArray(0, namen, 0, namen.Length); } }
Wie muss ich ein string[] definieren, damit es als Parameter verwendet werden kann?
Die Methode WriteArray ist folgendermaßen definiert:
public void WriteArray<T>(long position, T[] array, int offset, int count) where T : struct;
Da string kein struct ist, kannst Du diese Methode nicht für ein string[] verwenden. Da auch keine andere Write-Methode zur Verfügung steht, die einen string in ein MMF schreibt, musst Du Deinen String zuerst codieren.
using (MemoryMappedFile mmf = MemoryMappedFile.CreateOrOpen(_MMFName, 1024)) { using (MemoryMappedViewAccessor mmva = mmf.CreateViewAccessor()) { string[] namen = new string[] { "Hans", @"C:\Test\Versuch\Probe.TXT" };
// alle Strings ASCII codieren und in ein einziges byte[] projizieren var bytes = namen.SelectMany(s => Encoding.ASCII.GetBytes(s)).ToArray();
Ist vielleicht 'ne dumme Frage, aber wie wandle ich dann das Bytearray wieder in ein Stringarray um? Wenn ich es so mache:
Decoder d = Encoding.UTF8.GetDecoder(); char[] chars = new char[bytes.Length]; int charLen = d.GetChars(bytes, 0, bytes.Length,chars, 0);
habe ich zware alle Buchstaben wieder, aber kann die einzelnen Einträge aus dem Array nicht mehr separieren. Oder uss ich mir da ein eigenes System ausdenken?
Ja, da musst Du Dir ein eigenes System ausdenken. Wenn Du das MMF nur mit .NET ausliest, kannst Du mit Serialisierung arbeiten, d.h. string[] in eine serialisierbare Klasse packen, mit dem BinaryFormatter serialisieren und das resultierende byte[] ins MMF schreiben. Wenn Du das dann wieder deserialisierst, dann kümmert sich der BinaryFormatter um Dein string[]. Ansonsten ist es nicht unüblich, dass man sich da ein eigenes Format ausdenkt. Du musst die Metainformation ja nicht unbedingt im MMF halten, sondern kannst auch eine (z.B. XML) Datei danebenlegen, die die Struktur enthält.
Wenn ich es so mache:
Decoder d = Encoding.UTF8.GetDecoder();
char[] chars = new char[bytes.Length];
int charLen = d.GetChars(bytes, 0, bytes.Length,chars, 0);
habe ich zware alle Buchstaben wieder, aber kann die einzelnen Einträge aus dem Array nicht mehr separieren.
Oder uss ich mir da ein eigenes System ausdenken?