C # Разархивируйте текстовый файл (.getInputStream()) из архива в строку, используя SharpZipLib

#c# #unity3d #sharpziplib

#c# #unity3d #sharpziplib

Вопрос:

Как разархивировать текстовый файл из zip-архива в строку?

Нужен ли текстовому файлу также MemoryStream StreamReader двоичный файл изображения или похож на него?

В частности:

         foreach (ZipEntry e in zipFile)
        {
            if (e.IsFile)
            {
                string ext = Path.GetExtension(e.Name).ToLower();
                print(ext   " "   e.Name);
                if (ext == ".jpg" || ext == ".png" || ext == ".tga")
                {
                    Texture2D tex = new Texture2D(1, 1);
                    Stream zipStream = zipFile.GetInputStream(e);
                    tex.LoadImage(ReadFully(zipStream));

                    dicTexture.Add(e.Name,tex );
                } else if (ext == ".txt")
                {
                    Stream zipStream = zipFile.GetInputStream(e);
                    dicTxt.Add(e.Name, Encoding.Default.GetString(zipStream.)); // how do you populate this string here? 
                }
            }
        }


public static byte[] ReadFully(Stream input)
    {
        byte[] buffer = new byte[16 * 1024];
        using (MemoryStream ms = new MemoryStream())
        {
            int read;
            while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
            {
                ms.Write(buffer, 0, read);
            }
            return ms.ToArray();
        }
    }

  

Ответ №1:

Как и в случае с любым потоком, вы можете использовать StreamReader, обернутый вокруг потока, и вызвать ReadToEnd

 using(var x = new StreamReader(stream)){
  var theString =  x.ReadToEnd();
  //use theString
}
  

Если вы хотите указать кодировку, конструктор может принять для этого второй параметр

Комментарии:

1. Когда вы используете MemoryStream vs StreamReader ? Также обновлено, чтобы показывать readFully()

2. Кроме того, после использования программы чтения потоков, как вы преобразуете его в строку?

3. MemoryStream — это поток. StreamReader — это не поток, это средство чтения (TextReader). Он считывает данные из потока и создает строки. Вы не преобразуете StreamReader в строку так же, как вы не преобразуете верфь в нефтяной танкер. Вы используете StreamReader для чтения из потока и создания строки таким же образом, как вы используете верфь для создания нефтяного танкера. Я сделал это в своем ответе. Где я писал stream , это любой поток, такой как ваш zipStream , полученный при вызове zipFile.GetInputStream(e) .

4. Вы можете использовать MemoryStream для адаптации между массивом байтов и потоком, если у вас есть контекст, который требует одного, и контекст, который требует другого. В этом случае вам не нужно его использовать; вы можете просто спросить zip-файл, насколько велика запись, создать массив такого размера, а затем прочитать из потока и записать массив. MemoryStream в этом смысле немного расходует ресурсы, особенно потому, что toArray — это операция копирования, но в конечном итоге она работает так, как вы хотите, и ее следует оставить в покое, пока вы лучше не поймете внутреннюю работу