我不知道为什么,但我的分块上传不起作用。读取的第一个块可能是正确的,但以下块只包含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[]
- 填充了0
的数组。 chunkSize
为256kB(1024 * 256字节),我想要读取的文件大小约为11 MB(= 11000kB),因此应将其分成(int)Math.Ceiling((double)(file.fileSize / chunkSize))
个部分。
我做错了什么?
答案 0 :(得分:1)
根据文档,FileStream.Read
返回读取的字节数。所以循环如下:
while (fileStream.Read(chunkBuffer, 0, chunkBuffer.Length) > 0);
将一直运行到流结束。要读取您想要的块,您应该只调用一次方法:
fileStream.Read(chunkBuffer, 0, chunkBuffer.Length);
另外,请考虑使用using
语句,而不是手动关闭文件。