2016-10-20 4 views
0

Я пытаюсь сжать некоторый текст в приложении UWP. Я создал этот метод, чтобы сделать его проще в дальнейшем:Сжатие GZIPStream всегда возвращается 10 байт

public static byte[] Compress(this string s) 
{ 
    var b = Encoding.UTF8.GetBytes(s); 
    using (MemoryStream ms = new MemoryStream()) 
    using (GZipStream zipStream = new GZipStream(ms, CompressionMode.Compress)) 
    { 
     zipStream.Write(b, 0, b.Length); 
     zipStream.Flush(); //Doesn't seem like Close() is available in UWP, so I changed it to Flush(). Is this the problem? 
     return ms.ToArray(); 
    } 
} 

Но, к сожалению, это всегда возвращает 10 байт, независимо от того, что ввод текста. Это потому, что я не использую .Close() на GZipStream?

ответ

1

Вы возвращаете данные байта слишком рано. Метод Close() заменяется методом Dispose(). Таким образом, поток GZIP будет записан только тогда, когда он будет удален после вы покинете блок using(GZipStream) {}.

public static byte[] Compress(string s) 
{ 
    var b = Encoding.UTF8.GetBytes(s); 
    var ms = new MemoryStream(); 
    using (GZipStream zipStream = new GZipStream(ms, CompressionMode.Compress)) 
    { 
     zipStream.Write(b, 0, b.Length); 
     zipStream.Flush(); //Doesn't seem like Close() is available in UWP, so I changed it to Flush(). Is this the problem? 
    } 

    // we create the data array here once the GZIP stream has been disposed 
    var data = ms.ToArray(); 
    ms.Dispose(); 
    return data; 
} 
+0

Да, это работает как очарование! Я попытался использовать '.Dispose()' before, но вместо того, чтобы использовать его вне блока using(), я просто вызвал его перед возвратом данных, и это привело к тому, что 'ms' также удалился. Благодаря! – Reynevan