Kann die Stream.CopyTo () -Methode die Streams unvollständig speichern?

Ich habe einen WCF-Dienst, mit dem ich Dateien in Blöcken hochladen kann. Ich frage mich, ob dieser Code dazu führen kann, dass der hochgeladene Stream nur teilweise an den Ziel-Stream angehängt wird.

Ich habe meine Protokolle, aus denen hervorgeht, dass alle gesendeten Streams 512000 Byte groß sind (was ich auf der Clientseite festgelegt habe), und ich habe bisher 6 von 9 Chunks gesendet. Auf dem Server beträgt die Dateigröße jedoch 2634325. Dies bedeutet, dass der zuletzt gesendete Teil (6.) unvollständig gespeichert wird.

Was kann dieses Verhalten verursachen? Was soll ich tun, um dies zu vermeiden?

Oder ist das völlig sicher und ich sollte woanders nach dem Bug suchen?

public void UploadChunk ( RemoteFileChunk file )
{
    /// this file is not touched by anyone else
    var uploadPath = @"C:\some path\some.file";

    using ( var targetStream = new FileStream(uploadPath, FileMode.OpenOrCreate, FileAccess.Write, FileShare.None) )
    { 
        if ( targetStream.Length == file.ChunkNumber * Helper.ChunkSize )
        {
            /// ---- streaming operation is here ----
            targetStream.Position = targetStream.Length;
            file.Stream.CopyTo(targetStream);
            file.Stream.Close();
            /// -------------------------------------
        }
        else throw new FaultException<DataIntegrityException>(new DataIntegrityException
        {
            CurrentIndex = targetStream.Length,
            RequestedIndex = file.ChunkNumber * Helper.ChunkSize,
            Message = string.Format("{0}th chunk index requested when there already {1} chunks exist.", file.ChunkNumber, targetStream.Length / Helper.ChunkSize)
        });
    }
}

Und unten ist das clientseitige Code-Snippet zum Hochladen von Dateien:

var buffer = new byte[ChunkIndex != NumberOfChunks - 1 ? Helper.ChunkSize : LastPieceLen];

using ( var file = new FileStream(Info.FullName, FileMode.Open, FileAccess.Read, FileShare.None) )
{
    file.Position = (long)ChunkIndex * Helper.ChunkSize;
    file.Read(buffer, 0, buffer.Length);
}

var chunk = new MemoryStream(buffer);

chunk.Position = 0;
Service.StreamingEnd.UploadChunk(new RemoteFileChunk(FileId, CF.Id, VersionDate, ChunkIndex, chunk.Length, Sessions.Get(), chunk));

Antworten auf die Frage(2)

Ihre Antwort auf die Frage