【问题标题】:Why this chunk reading code doesn't work?为什么这个块读取代码不起作用?
【发布时间】:2014-10-05 10:34:45
【问题描述】:

我不知道为什么,但是我的分块上传不起作用。读取的第一个块可能是正确的,但后面的块只包含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)) 部分。

我做错了什么?

【问题讨论】:

    标签: c# .net stream chunks


    【解决方案1】:

    根据文档,FileStream.Read 返回读取的字节数。所以下面的循环:

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

    将一直运行到流结束。要读取您想要的块,您应该只调用一次该方法:

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

    另外,考虑使用using 语句而不是手动关闭文件。

    【讨论】:

      猜你喜欢
      • 2018-11-05
      • 2012-02-22
      • 2023-03-03
      • 2017-10-02
      • 2016-07-10
      • 2010-12-14
      • 2017-04-09
      • 2013-01-30
      • 2014-05-23
      相关资源
      最近更新 更多