Распаковка zip архива в Unity3D

Приветствую! Опишу свой опыт работы с zip архивами. На первый взгляд, казалось, тривиальнейшная задача. Андроид завелся мигом, а вот iOS(il2cpp) сразу выдал ошибки. Поэтому если хотите сэкономить пару часов разработки, внимайте:)

Задача — распаковать zip архив

Приступим

1. Инструмент — github.com/r2d2rigo/dotnetzip-for-unity (PC,Android,iOS)

Однако, мне не удалось нормально собрать либу, и один товарищ помог с этим, за что ему большое спасибо! Рекомендую скачать dll файл вот тут(прямая ссылка).

2. Кладем dll файл в папку Assets\Plugins\

3. Обертка над либой:

		public static void Unpack(string zipfilePath, string location)
		{
			// создаем папку куда будем распаковывать
			Directory.CreateDirectory(location);

			//распаковываем зип файл и начинаем читать файлы
			using (ZipFile zip = ZipFile.Read(zipfilePath))
			{
				var z = zip.GetEnumerator();
				
				while (z.MoveNext())
				{
					var t = z.Current;
					if (t == null) 
						continue;
					
					var path = location + "/" + t.FileName.Replace("\\", "/");
					
					using (FileStream s = File.Create(path))
					{
						t.Extract(s);
					}
				}
			}
		}


4. Теперь можно распаковывать:

...
Unpack(Path.Combine(Application.persistentDataPath,"myArchive.zip"),Path.Combine(Application.persistentDataPath,"outputDir"));
...


Итог — умеем распаковывать зипки)

5 комментариев

avatar
Ну а что если архив будет большим, скажем на 500 и более Мб, программа увиснет по самое не хочу… если можно мысли вслух =)
avatar
Немного капнул, в общем я так понял вызывается > Метод Thread.Sleep < во время процесса распаковки, ну да и код немного другой…
Directory.CreateDirectory (location);
using (ZipFile zip = ZipFile.Read (zipFilePath)) {
zip.ExtractAll (location, ExtractExistingFileAction.OverwriteSilently);
avatar
Фух… дело было в корутинах (фриз при распаковке) в итоге :(
avatar
Можно кстати через Метод BackgroundWorker асинхронную загрузку с прогресбар сделать ;)
avatar
да надо бы асинхронно, потому что даже небольшие архивы распаковывает по 5-10 секунд
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.