1

NetworkStream 経由でファイルを送信し、クライアント側で再構築しようとしています。データを正しく取得できます (私は思います) が、BinaryWriter または FileStream オブジェクトのいずれかを使用してファイルを再作成すると、使用する方法論に関係なく、最初は同じ時点でファイルが途切れます。

  private void ReadandSaveFileFromServer(ref TcpClient clientATF,ref NetworkStream currentStream, string locationToSave)
    {
        int fileSize = 0;
        string fileName = "";

        fileName = ReadStringFromServer(ref clientATF,ref currentStream);
        fileSize = ReadIntFromServer(ref clientATF,ref currentStream);

        byte[] fileSent = new byte[fileSize];

        if (currentStream.CanRead && clientATF.Connected)
        {

            currentStream.Read(fileSent, 0, fileSent.Length);
            WriteToConsole("Log Recieved");

        }
        else
        {
            WriteToConsole("Log Transfer Failed");
        }

        FileStream fileToCreate = new FileStream(locationToSave + "\\" + fileName, FileMode.Create);
        fileToCreate.Seek(0, SeekOrigin.Begin);
        fileToCreate.Write(fileSent, 0, fileSent.Length);
        fileToCreate.Close();

        //binWriter = new BinaryWriter(File.Open(locationToSave + "\\" + fileName, FileMode.Create));
        //binWriter.Write(fileSent);
        //binWriter.Close();

    }

ステップスルーしてfileNameとfileSizeを確認すると、それらは正しいです。byte[] も完全に設定されています。次に何ができるか、何か手がかりはありますか?

前もって感謝します...

ショーン

編集!!!:

だから私は何が起こっているのかを理解しました。文字列を読み取ってからストリームから Int を読み取ると、バイト配列は 256 インデックスの長さになります。したがって、文字列の読み取りは int を取り入れているため、他の領域が破壊されます。これを理解する必要があります...

4

3 に答える 3

3

Jon Skeet の回答に追加するには、読み取りコードは次のようにする必要があります。

int bytesRead;
int readPos = 0;
do
{
    bytesRead = currentStream.Read(fileSent, readPos, fileSent.Length);
    readPos += bytesRead;
} while (bytesRead > 0);
于 2010-09-20T16:00:02.790 に答える
3

1 つには、コンビニエンス メソッドFile.WriteAllBytesを使用して、データをより簡単に書き込むことができます。しかし、それが問題だとは思えません。

Read の 1 回の呼び出しですべてのデータを読み取ることができると想定しています。戻り値を無視しています。そうしないでください。代わりに、期待するすべてを読むか、ストリームの最後に到達するまで、複数回読んでください。詳細については、この記事を参照してください。.NET 4 を使用しているCopyTo場合、便利な新しい方法があります。

(余談ですが、 の使用は、それが実際に何を意味するのかを理解していないことを示唆しています。C# で引数がどのように渡されるかrefを理解することは十分に価値があります。)

于 2010-09-20T15:56:11.297 に答える