2015-03-09 2 views
3

У меня есть служба WCF, которая позволяет загружать файлы в куски. Мне интересно, может ли этот код привести к тому, что загруженный поток будет только частично добавлен к целевому потоку в любом случае?Может ли метод Stream.CopyTo() сохранять потоки незавершенными?

У меня есть мои журналы, которые показывают мне, что все отправленные потоки составляют 512000 байт (которые я установил на стороне клиента), и я отправил 6 кусков из 9 фрагментов. Но на сервере размер файлов составляет 2634325. Это означает, что последний кусок, отправленный (6-й), сохраняется не полностью.

Что может быть причиной такого поведения? Что я должен сделать, чтобы этого избежать?

Или это абсолютно безопасно, и я должен искать ошибку в другом месте?

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

И ниже клиент сторона файл кода загрузки сниппет:

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

[Основная реализация 'Stream.CopyTo()'] (http://referencesource.microsoft.com/#mscorlib/system/io/stream.cs,98ac7cf3acb04bb1) очень проста и не способна вызвать поведение, которое вы описываете. У вас есть ошибка где-то еще. Измените свой вопрос так, чтобы он включал [хороший, _minimal_, _complete_ пример кода] (http://stackoverflow.com/help/mcve), который надежно воспроизводит проблему. –

+0

Как работает куски? Это HTTP chunking? Эти куски не имеют фиксированного размера. – CodeCaster

+0

Я добавил фрагмент кода загрузки. Но так как эти проблемы возникают, и вопрос на самом деле требует представления о вероятной причине странного поведения, я думаю, что не могу поставить код, который надежно воспроизводит проблему. –

ответ

0

Посмотрите, что если заявление - это окончательный кусок гарантированно точно размер порции? Что произойдет, если размер загружаемого файла не будет кратным размеру блока?

+0

Фактически этот файл состоит из 17 кусков. и если вы посмотрите на код загрузки, появится обработчик для последнего фрагмента. Так что этот случай действительно покрыт. –

Смежные вопросы