2014-10-05 1 views
2

이유는 모르지만 청크 업로드는 작동하지 않습니다. 아마 첫 번째 청크가 올바르지 만 다음 청크는 0 만 포함합니다.이 청크 읽기 코드가 작동하지 않는 이유는 무엇입니까?

/// <summary> 
    /// Gibt die Bytesequenz des angeforderten Chunks zurück 
    /// </summary> 
    /// <param name="chunkNumber">Die Position des Chunks im Array</param> 
    /// <returns>Die Bytesequenz des angeforderten Chunks</returns> 
    byte[] FileToChunk(int chunkNumber) 
    { 
     byte[] chunkBuffer = new byte[chunkSize]; 
     FileStream fileStream = new 
      FileStream("C:\\Users\\Patrick\\Downloads\\Prog\\UnityAssets\\start.unitypackage" 
           , FileMode.Open 
           , FileAccess.Read 
          ); 
     fileStream.Seek((chunkNumber - 1) * chunkSize, SeekOrigin.Begin); 
     while (fileStream.Read(chunkBuffer, 0, chunkBuffer.Length) > 0); 
     if ( fileStream.Position != fileStream.Length 
      && fileStream.Position != fileStream.Position - 1 
      ) 
       fileStream.Close(); 
     return chunkBuffer; 
    } 

그래서 추출해야 청크의 수는 인수로 전달되며, fileStream.Seek()와 내가 물었다되는 청크의 위치를 ​​가고 싶어. 이미 말했듯이이 메서드의 첫 번째 호출은 작동하는 청크를 반환하지만 다른 모든 호출은 으로 채워진 Byte[] - 배열을 반환합니다. chunkSize은 256kB (1024 * 256 바이트)이고 읽으려는 파일의 크기는 11MB (= 11000kB)이므로 (int)Math.Ceiling((double)(file.fileSize/chunkSize)) 부분으로 분할해야합니다.

내가 뭘 잘못하고 있니?

답변

1

설명서에 따르면 FileStream.Read은 읽은 바이트 수를 반환합니다. 따라서 다음 루프는 다음과 같습니다.

while (fileStream.Read(chunkBuffer, 0, chunkBuffer.Length) > 0); 

은 스트림이 끝날 때까지 실행됩니다. 당신은 당신이 한 번만 메소드를 호출해야 할 청크 읽으려면 : 또한

fileStream.Read(chunkBuffer, 0, chunkBuffer.Length); 

을의 using 문을 사용하는 대신 수동으로 파일을 닫는 것이 좋습니다.

관련 문제