2

おはようございます!

ここで新たな問題が発生しました。システムで宣言した構造体からのデータを書き留める必要があります。

私が作成した構造体には 2 つのフィールドしかなく、後でそれをバイトに変換するために使用します。

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
public struct MyStructData
{
    public short Id;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
    public string Name;
}

次のコードを使用して、この構造体をバイト単位で変換します。

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;
}

この関数は、別のマシンに送信するすべてのレジスタがある MyStructData タイプ要素のリスト構造内の各要素を変換するように作成されており、以下に貼り付けたコードを使用して実行します。

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();
}

私の問題は、新しいファイルが空であり、バイトの情報を取得できない理由がわからないことです。リストにデータが含まれているかどうかは既に確認しており、バイト変換機能も完全に機能することも確認しましたが、ファイルが空の原因を特定することはできません。

誰かがトンネルの終わりにある光を知っているなら、私はあなたの助けに感謝します!

編集今、データをファイルに書き込む別の方法があり、うまく機能します:

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);
        }
    }
}
4

2 に答える 2

4

の 3 番目のパラメータは、書き込むFileStream.Writeバイト数です。0 であってはなりません。

string saveToFilePath = "D:\\" + filename;
Stream myStream = myFtpRequest.GetRequestStream();

int bytesWritten = 0;
using (FileStream myFileStream = new FileStream(saveToFilePath, FileMode.Create))
{
    foreach (MyStructData myData in myStructDataList)
    {
        newBuffer = getBytes(myData);
        myFileStream.Write(newBuffer, 0, newBuffer.Length);
        bytesWritten += newBuffer.Length;
    }
}
于 2013-06-27T08:47:36.997 に答える