¿Puede el método Stream.CopyTo () guardar las transmisiones incompletas?

Tengo un servicio WCF que me permite cargar archivos en fragmentos. Lo que me pregunto es si este código puede causar que la secuencia cargada se agregue solo parcialmente a la secuencia de destino en cualquier caso.

Tengo mis registros que me muestran que todas las transmisiones enviadas son 512000 bytes (que configuré en el lado del cliente) y hasta ahora he enviado 6 fragmentos de 9 fragmentos. Pero en el servidor el tamaño de los archivos es 2634325. Lo que significa que el último fragmento enviado (6to) se guarda de forma incompleta.

¿Qué puede estar causando este comportamiento? ¿Qué debo hacer para evitar esto?

¿O es esto completamente seguro, y debería buscar el error en otro lugar?

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

Y a continuación se muestra el fragmento de código de carga de archivos del lado del cliente:

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

Respuestas a la pregunta(1)

Su respuesta a la pregunta