Ich bin dabei, tonnenweise Binärdateien zu lesen, jede mit 1000 oder mehr Datensätzen. Es kommen ständig neue Dateien hinzu, also schreibe ich einen Windows-Dienst, der die Verzeichnisse überwacht und neue Dateien verarbeitet, sobald sie eingehen. Die Dateien wurden mit einem C++-Programm erstellt. Ich habe die Strukturdefinitionen in c# neu erstellt und kann die Daten gut lesen, aber ich bin besorgt, dass die Art und Weise, wie ich es tue, schließlich meine Anwendung beenden wird.
using (BinaryReader br = new BinaryReader(File.Open("myfile.bin", FileMode.Open)))
{
long pos = 0L;
long length = br.BaseStream.Length;
CPP_STRUCT_DEF record;
byte[] buffer = new byte[Marshal.SizeOf(typeof(CPP_STRUCT_DEF))];
GCHandle pin;
while (pos < length)
{
buffer = br.ReadBytes(buffer.Length);
pin = GCHandle.Alloc(buffer, GCHandleType.Pinned);
record = (CPP_STRUCT_DEF)Marshal.PtrToStructure(pin.AddrOfPinnedObject(), typeof(CPP_STRUCT_DEF));
pin.Free();
pos += buffer.Length;
/* Do stuff with my record */
}
}
Ich glaube nicht, dass ich GCHandle verwenden muss, weil ich nicht tatsächlich mit der C++-Anwendung kommuniziere, alles wird von verwaltetem Code getan, aber ich weiß nicht, eine alternative Methode.