Schreiben von bytes aus einem struct in eine Datei mit c#
Guten morgen allerseits!
Bin ich mit einem neuen problem hier. Ich Schreibe Daten aus einem struct, der ich erklärte in meinem sistem.
Die Struktur habe ich geschaffen, hat nur zwei Felder, und ich verwenden, um zu später conevrt in bytes.
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
public struct MyStructData
{
public short Id;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
public string Name;
}
Ich konvertieren Sie diese Struktur in bytes mit dem folgenden code:
private byte[] getBytes(MyStructData aux)
{
int length = Marshal.SizeOf(aux);
IntPtr ptr = Marshal.AllocHGlobal(length);
byte[] myBuffer = new byte[length];
Marshal.StructureToPtr(aux, ptr, true);
Marshal.Copy(ptr, myBuffer, 0, length);
Marshal.FreeHGlobal(ptr);
return myBuffer;
}
Diese Funktion zu transformieren jedes Elementes in einer Liste Struktur MyStructData Typ-Elemente, wo ich alle die Register, die ich senden möchten, auf einer anderen Maschine, und ich mache es mit den code eingefügt unter:
string saveToFilePath = "D:\\" + filename;
Stream myStream = myFtpRequest.GetRequestStream();
using (FileStream myFileStream = new FileStream(saveToFilePath, FileMode.Create))
{
foreach (MyStructData myData in myStructDataList)
{
int length = 2048;
byte[] newBuffer = new byte[length];
newBuffer = getBytes(myCust);
int len = 0;
int bytesRead = 0;
myFileStream.Write(newBuffer, 0, len);
bytesRead += len;
}
myFileStream.Close();
}
Mein problem kommt, dass ich sehe, dass meine neue Datei ist leer und ich kann nicht sehen, warum es nicht bekommt die Informationen von meinem bytes. Ich habe bereits überprüft, ob die Liste kommt mit den Daten oder nicht und ich habe auch überprüft, dass mein byte-Konvertierung-Funktion funktioniert auch einwandfrei, aber ich kann nicht auf den Punkt kommen, um zu sehen, was verursacht, dass meine Datei ist leer.
Wenn jemand weiß, das Licht am Ende des Tunnels, ich würde schätzen es sehr, dass Ihre Hilfe!
BEARBEITEN Jetzt habe ich eine andere Methode zum schreiben der Daten in die Datei und es funktioniert gut:
using (Stream stream = new FileStream(saveToFilePath, FileMode.Create, FileAccess.Write, FileShare.ReadWrite))
{
using (BinaryWriter writer = new BinaryWriter(stream, Encoding.Default))
{
//get all data
foreach (MyStructData myData in myStructDataList)
{
byte[] newBuffer = getBytes(cd);
writer.Write(newBuffer);
}
}
}
InformationsquelleAutor Marialvy Martínez | 2013-06-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Dritten parameter, um
FileStream.Write
ist die Anzahl der bytes an, die schreiben. Es sollte nicht 0 sein.Sorry, ich bearbeitet die Antwort.
Danke!!! Dies funktioniert gut, jetzt gehe ich mit meinem nächsten problem, also ich hoffe, dass ich nicht die Mühe, Sie alle
InformationsquelleAutor Ahmed KRAIEM
Ich glaube nicht, dass Sie sollten das schreiben der Daten in eine Datei wie diese. Für eine einfache Struktur wie die, Sie wäre besser dran mit einem
BinaryFormatter
.Hier ist ein Beispiel. Zuerst müssen Sie, um
MyStructData
serializable, indem die[Serializable]
Attribut:Dann schreiben Sie eine Liste dieser Strukturen, um eine Datei etwa so:
Und Sie können Sie Lesen, wieder wie so:
Wenn Sie nur deshalb Hinzugefügt, die die Anordnung der Struktur war, so dass Sie kann Lesen und schreiben und aus einer Datei, könnte Sie dann entfernen, damit Ihre Struktur würde wie folgt Aussehen:
behandeln kann ziemlich komplizierte Dinge. Was es nicht umgehen kann, ist Dinge im Zusammenhang mit nicht verwalteten Ressourcen (z.B. ein Fenster behandeln), aber ich sollte nicht denken, Sie wäre serialisieren von denen. Ich nur empfehlen BinaryFormatter, weil es ist ziemlich einfach zu bedienen. Für mehr Kontrolle, die Sie verwenden können XmlSerializer. So oder so, sollten Sie wirklich nicht sein, marshalling der Daten selbst, nur um es zu serialisieren! Marshalling ist wirklich zum übergeben von Daten an nicht verwalteten code.
Ich empfehle Sie Lesen Sie diese, bevor Sie eine Entscheidung: msdn.microsoft.com/en-us/library/vstudio/ms233843.aspx Eine Sache, die ich sagen kann: Mit Marschall zu tun Serialisierung ist sehr falsch.
Ich fand einen anderen Weg, es zu tun, aber mit der
BinaryWriter
habe, versuchte ich es nun und es funktioniert auch perfekt. Ich habe meine Bedenken weil ich irgendwo gelesen hier, dass dieBinaryFormatter
hat ein paar Probleme auch. Aber ich denke, die Entscheidungen sind getroffen, weil von dem, was Sie sind komfortabel mit 🙂Entweder BinaryFormatter oder XmlSerializer (zusammen mit DataContacts) - die letzteren sind die "modernen", aber XmlSerializer wird, erhöhen Sie die Größe der Daten, so müssen Sie möglicherweise auch zu komprimieren.
InformationsquelleAutor Matthew Watson