#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
vsStreamReader
? Также обновлено, чтобы показывать readFully()2. Кроме того, после использования программы чтения потоков, как вы преобразуете его в строку?
3. MemoryStream — это поток. StreamReader — это не поток, это средство чтения (TextReader). Он считывает данные из потока и создает строки. Вы не преобразуете StreamReader в строку так же, как вы не преобразуете верфь в нефтяной танкер. Вы используете StreamReader для чтения из потока и создания строки таким же образом, как вы используете верфь для создания нефтяного танкера. Я сделал это в своем ответе. Где я писал
stream
, это любой поток, такой как вашzipStream
, полученный при вызовеzipFile.GetInputStream(e)
.4. Вы можете использовать MemoryStream для адаптации между массивом байтов и потоком, если у вас есть контекст, который требует одного, и контекст, который требует другого. В этом случае вам не нужно его использовать; вы можете просто спросить zip-файл, насколько велика запись, создать массив такого размера, а затем прочитать из потока и записать массив. MemoryStream в этом смысле немного расходует ресурсы, особенно потому, что toArray — это операция копирования, но в конечном итоге она работает так, как вы хотите, и ее следует оставить в покое, пока вы лучше не поймете внутреннюю работу