为什么我需要两次调用来传输CopyTo?

时间:2010-08-09 12:41:26

标签: c# c#-4.0 stream

我有以下方法,由于某种原因,第一次调用Copy似乎什么也没做?谁知道为什么? 在压缩方法的输入中,base64可以根据需要提供该方法。

private byte[] GetFileChunk(string base64)
    {
        using (
            MemoryStream compressedData = new MemoryStream(Convert.FromBase64String(base64), false),
            uncompressedData = new MemoryStream())
        {

            using (GZipStream compressionStream = new GZipStream(compressedData, CompressionMode.Decompress))
            {
                // first copy does nothing ?? second works
                compressionStream.CopyTo(uncompressedData);
                compressionStream.CopyTo(uncompressedData);
            }

            return uncompressedData.ToArray();
        }
    }

4 个答案:

答案 0 :(得分:2)

只是一个猜测,但是因为新的GZipStream构造函数将索引保留在数组的末尾,并且第一个CopyTo将其重置为开头,因此当您调用第二个时CopyTo它现在处于开始状态并正确复制数据?

答案 1 :(得分:2)

如果对Read()的第一次调用返回0,那么Stream.CopyTo()也不会起作用。虽然这表明GZipStream存在问题,但非常不太可能存在类似这样的错误。创建压缩数据时出现问题的可能性更大。比如首先压缩0个字节,然后压缩实际数据。

答案 2 :(得分:1)

你有多确定第一份副本什么都不做,而第二份副本无效 ,这将是GZipStream类中的错误。您的代码应该可以正常工作,而无需两次调用CopyTo。

答案 3 :(得分:0)

嗨,谢谢大家的意见。事实证明,错误是由编码方法中的错误引起的。方法是

  /// <summary>
    /// Compress file data and then base64s the compressed data for safe transportation in XML.
    /// </summary>
    /// <returns>Base64 string of file chunk</returns>
    private string GetFileChunk()
    {
        // MemoryStream for compression  output
        using (MemoryStream compressed = new MemoryStream())
        {
            using (GZipStream zip = new GZipStream(compressed, CompressionMode.Compress))
            {

                // read chunk from file
                byte[] plaintext = new byte[this.readSize];
                int read = this.file.Read(plaintext, 0, plaintext.Length);

                // write chunk to compreesion
                zip.Write(plaintext, 0, read);
                plaintext = null;

                // Base64 compressed data
                return Convert.ToBase64String(compressed.ToArray());
            }
        }
    }

返回行应低于允许压缩流关闭和刷新的使用,这会在解压缩流时导致不一致的行为。

        /// <summary>
    /// Compress file data and then base64s the compressed data for safe transportation in XML.
    /// </summary>
    /// <returns>Base64 string of file chunk</returns>
    private string GetFileChunk()
    {
        // MemoryStream for compression  output
        using (MemoryStream compressed = new MemoryStream())
        {
            using (GZipStream zip = new GZipStream(compressed, CompressionMode.Compress))
            {

                // read chunk from file
                byte[] plaintext = new byte[this.readSize];
                int read = this.file.Read(plaintext, 0, plaintext.Length);

                // write chunk to compreesion
                zip.Write(plaintext, 0, read);
                plaintext = null;
            }

            // Base64 compressed data
            return Convert.ToBase64String(compressed.ToArray());
        }
    }

感谢大家的帮助。