=======================
=======================
=======================
유니티 설치폴더 Editor\Data\Mono\lib\mono\unity에서
I18N.dll
I18N.West.dll
복사해서 유니티 에디터 Plugins에 넣기
첨부파일
ICSharpCode.SharpZipLib.dll
ICSharpCode.SharpZipLib.dll 다운 받아 Plugins에 넣기
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Collections; using System.IO; using ICSharpCode.SharpZipLib.Zip; // Using ICSharpCode.SharpZipLib.Zip >> GNU GENERAL PUBLIC LICENSE Version 2 namespace TestWeb { public class ZipManager { /// /// 특정 폴더를 ZIP으로 압축 /// /// 압축 대상 폴더 경로 /// 저장할 ZIP 파일 경로 /// 압축 암호 /// 폴더 삭제 여부 /// 압축 성공 여부 public static bool ZipFiles(string targetFolderPath, string zipFilePath, string password, bool isDeleteFolder) { bool retVal = false; // 폴더가 존재하는 경우에만 수행. if (Directory.Exists(targetFolderPath)) { // 압축 대상 폴더의 파일 목록. ArrayList ar = GenerateFileList(targetFolderPath); // 압축 대상 폴더 경로의 길이 + 1 int TrimLength = (Directory.GetParent(targetFolderPath)).ToString().Length + 1; // find number of chars to remove. from orginal file path. remove '\' FileStream ostream; byte[] obuffer; string outPath = zipFilePath; // ZIP 스트림 생성. ZipOutputStream oZipStream = new ZipOutputStream(File.Create(outPath)); try { // 패스워드가 있는 경우 패스워드 지정. if (password != null && password != String.Empty) oZipStream.Password = password; oZipStream.SetLevel(9); // 암호화 레벨.(최대 압축) ZipEntry oZipEntry; foreach (string Fil in ar) { oZipEntry = new ZipEntry(Fil.Remove(0, TrimLength)); oZipStream.PutNextEntry(oZipEntry); // 파일인 경우. if (!Fil.EndsWith(@"/")) { ostream = File.OpenRead(Fil); obuffer = new byte[ostream.Length]; ostream.Read(obuffer, 0, obuffer.Length); oZipStream.Write(obuffer, 0, obuffer.Length); } } retVal = true; } catch { retVal = false; // 오류가 난 경우 생성 했던 파일을 삭제. if (File.Exists(outPath)) File.Delete(outPath); } finally { // 압축 종료. oZipStream.Finish(); oZipStream.Close(); } // 폴더 삭제를 원할 경우 폴더 삭제. if (isDeleteFolder) try { Directory.Delete(targetFolderPath, true); } catch { } } return retVal; } /// /// 파일, 폴더 목록 생성 /// /// 폴더 경로 /// 폴더, 파일 목록(ArrayList) private static ArrayList GenerateFileList(string Dir) { ArrayList fils = new ArrayList(); bool Empty = true; // 폴더 내의 파일 추가. foreach (string file in Directory.GetFiles(Dir)) { fils.Add(file); Empty = false; } if (Empty) { // 파일이 없고, 폴더도 없는 경우 자신의 폴더 추가. if (Directory.GetDirectories(Dir).Length == 0) fils.Add(Dir + @"/"); } // 폴더 내 폴더 목록. foreach (string dirs in Directory.GetDirectories(Dir)) { // 해당 폴더로 다시 GenerateFileList 재귀 호출 foreach (object obj in GenerateFileList(dirs)) { // 해당 폴더 내의 파일, 폴더 추가. fils.Add(obj); } } return fils; } /// /// 압축 파일 풀기 /// /// ZIP파일 경로 /// 압축 풀 폴더 경로 /// 해지 암호 /// zip파일 삭제 여부 /// 압축 풀기 성공 여부 public static bool UnZipFiles(string zipFilePath, string unZipTargetFolderPath, string password, bool isDeleteZipFile) { bool retVal = false; // ZIP 파일이 있는 경우만 수행. if(File.Exists(zipFilePath)) { // ZIP 스트림 생성. ZipInputStream zipInputStream = new ZipInputStream(File.OpenRead(zipFilePath)); // 패스워드가 있는 경우 패스워드 지정. if (password != null && password != String.Empty) zipInputStream.Password = password; try { ZipEntry theEntry; // 반복하며 파일을 가져옴. while ((theEntry = zipInputStream.GetNextEntry()) != null) { // 폴더 string directoryName = Path.GetDirectoryName(theEntry.Name); string fileName = Path.GetFileName(theEntry.Name); // 파일 // 폴더 생성 Directory.CreateDirectory(unZipTargetFolderPath + directoryName); // 파일 이름이 있는 경우 if (fileName != String.Empty) { // 파일 스트림 생성.(파일생성) FileStream streamWriter = File.Create((unZipTargetFolderPath + theEntry.Name)); int size = 2048; byte[] data = new byte[2048]; // 파일 복사 while (true) { size = zipInputStream.Read(data, 0, data.Length); if (size > 0) streamWriter.Write(data, 0, size); else break; } // 파일스트림 종료 streamWriter.Close(); } } retVal = true; } catch { retVal = false; } finally { // ZIP 파일 스트림 종료 zipInputStream.Close(); } // ZIP파일 삭제를 원할 경우 파일 삭제. if (isDeleteZipFile) try { File.Delete(zipFilePath); } catch { } } return retVal; } } } |
사용법
압축 풀기 : ZipManager.UnZipFiles(@"D:\ZipTest\zipFile\Video.zip", @"D:\ZipTest\unzipFolder\", "비빌번호 설정", false);
압축 하기 : ZipManager.ZipFiles(@"D:\ZipTest\unzipFolder\", @"D:\ZipTest\zipFile\Video.zip", "비밀번호", false);
사용하기
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System.IO;
using zip;
public class connect : MonoBehaviour {
void Start () {
//
zip.ZipManager.ZipFiles(@"D:\압축풀어지는 폴더\file.zip", @"D:\압축풀어지는 폴더" ,"빌번", false);
//압축해제
zip.ZipManager.UnZipFiles(@"D:\압축풀어지는 폴더\file.zip", @"D:\압축풀어지는 폴더" ,"빌번", false); //빌번 없으면 "" 으로 하면됨
}
}
[출처] unity Zip 압축풀기,해제 ICSharpCode.SharpZipLib|작성자 귀폭
=======================
=======================
=======================
출처: http://devkorea.co.kr/bbs/board.php?bo_table=m03_qna&wr_id=10948
안녕하세요.
유니티 뉴비 개발자입니다.
일단 윈도우에서 DotNetZip을 이용해서 메모리스트림의 내용을 압축하고 압축해제 하는 내용을 구현 완료하였습니다. DotnetZip의 Ionic.Zip.dll 을 이용했죠...
이게 안드로이드 크로스빌드에선 상관이 없었는데 iOS로 넘어가니 빌드 에러가 나더군요.. 찾아보니 dll 을 사용하면 iOS에서는 빌드가 안된다는 내용을 어디선가 찾았습니다.
근데 어떻게든 크로스컴파일이 가능한 압축 방법을 찾아야하는데 찾을 수가 없네요.
유니티 자체에 zip을 제공하면 좋으련만 없는건지 못찾는건지;;
Zip 소스를 바로 붙이려니 자바스크립트로 된 소스여야한다고 하고;;;;
iOS 크로스컴파일이 가능한 Zip압축.. 아시는 고수분들 제발 알려주세요 ~_~
======================
iOS 에서 빌드 시 나오는 에러 메시지 추가합니다.
#1
Cross compilation job Ionic.Zip.dll failed.
UnityEngine.UnityException: Failed AOT cross compiler: /Applications/Unity/Unity.app/Contents/BuildTargetTools/iPhonePlayer/mono-xcompiler --aot=full,asmonly,nodebug,static,outfile="Ionic.Zip.dll.s" "Ionic.Zip.dll" current dir : /Users/경로/Temp/StagingArea/Data/Managed
result file exists: False
stdout:
stderr:
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SharpZipLib를 dll로 만들어서 plugins에 넣으신후 사용하시면 아이폰 안드로이드 양쪽다 됩니다.
저도 그렇게 사용하고 있습니다.
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
레온하트스퀄// 답변 감사드립니다. 일단 SharpZipLib 을 이용해서 시도를 해봐야겠네요.
몇가지 궁금한게 있습니다.
그런데 SharpZipLib의 공개소스로 dll을 직접 만들어 사용하라는 말씀이신지요?
직접 만든 dll 이랑 웹사이트에서 제공하는 ICSharpCode.SharpZipLib.dll 을 이용하는 거랑 무언가 다른게 있나요?
그리고 저희 프로젝트는 유니티 스크립트로 C#이 아닌 자바스크립트를 쓰고 있는데 혹시 이게 문제가 되진 않을까요?
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
저 같은 경우엔 소스만 받아다 dll파일을 만들어서 사용했습니다.
하지만 제공되는 SharpZipLib.dll 을 사용하셔도 문제 없지 않을까 생각이 됩니다.
기본적으로 C#으로만 작업하는지라 자바스크립터에서도 잘 작동될지는 해보지 않아 모르겠지만
어차피 플러그인 방식으로 움직이게 되기 때문에 별 문제는 없을듯 합니다.
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
레온하트스퀄// 네네. SharpZip 이 답이었네요. 제가 플러그인에 대한 기본적인 이해가 안됐었네요.
답변 선택은 처음 알려주신 세세님으로 해야겠네요.. 레온하트스퀄님께도 무쟈게 감사드립니다.
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
=======================
=======================
=======================
출처: http://ierosa.blogspot.com/2016/07/sharpziplib.html
유니티에서 SharpZipLib 사용한 압축 저장방법
우선 아래 url에서
http://icsharpcode.github.io/SharpZipLib/
Download.zip 을 통해 프로젝트를 다운받음.
Visual Studio (2015)로 부른 후 ICSharpCode.SharpZipLib 시작프로젝트로 설정
project 메뉴에서 맨 아래쪽에 Properties - Application - Target framework 를
.Net Framework 2.0으로 변경
release 로 빌드한 ICSharpCode.SharpZipLib.dll 를 유니티 적당한 장소에 복사하면 준비 끝.
현재 프로젝트에서 로컬에 데이터를 압축저장하기 사용함.
압축 및 저장하기
게임정보클래스 = gi;
BinaryFormatter _binary_formatter = new BinaryFormatter();
FileStream _filestream = File.Create(Application.persistentDataPath + "/파일이름");
#if ZIP_NONE // 압축하지 않을 경우
_binary_formatter.Serialize(_filestream, gi);
#elif ZIP_BZIP2
MemoryStream buffer = null;
MemoryStream m_msBZip2 = null;
BZip2OutputStream m_osBZip2 = null;
try
{
buffer = new MemoryStream();
_binary_formatter.Serialize(buffer, gi);
m_msBZip2 = new MemoryStream();
_binary_formatter.Serialize(buffer, gi);
Int32 size = (int)buffer.Length;
// Prepend the compressed data with the length of the uncompressed data (firs 4 bytes)
//
using (BinaryWriter writer = new BinaryWriter(m_msBZip2, System.Text.Encoding.ASCII))
{
writer.Write(size);
m_osBZip2 = new BZip2OutputStream(m_msBZip2);
m_osBZip2.Write(buffer.ToArray(), 0, size);
m_osBZip2.Close();
BinaryWriter bw = new BinaryWriter(_filestream);
bw.Write(m_msBZip2.ToArray(), 0, m_msBZip2.ToArray().Length);
buffer.Close();
m_msBZip2.Close();
bw.Close();
writer.Close();
}
}
finally
{
if (m_osBZip2 != null)
{
m_osBZip2.Dispose();
}
if (m_msBZip2 != null)
{
m_msBZip2.Dispose();
}
if (buffer != null)
{
buffer.Dispose();
}
}
#endif
_filestream.Close();
압축 해제 및 불러오기
게임정보클래스 Load()
{
게임정보클래스 gi = null;
bool _file_check = File.Exists(Application.persistentDataPath + "/파일이름");
if (_file_check)
{
FileStream _filestream = null;
try
{
BinaryFormatter _binary_formatter = new BinaryFormatter();
_filestream = File.Open((Application.persistentDataPath + "/파일이름"), FileMode.Open);
#if ZIP_NONE
gi = (GameInfo)_binary_formatter.Deserialize(_filestream);
#elif ZIP_BZIP2
MemoryStream m_msBZip2 = null;
BZip2InputStream m_isBZip2 = null;
try
{
using (BinaryReader reader = new BinaryReader(_filestream, System.Text.Encoding.ASCII))
{
Int32 size = reader.ReadInt32();
m_isBZip2 = new BZip2InputStream(_filestream);
byte[] bytesUncompressed = new byte[size];
m_isBZip2.Read(bytesUncompressed, 0, bytesUncompressed.Length);
m_msBZip2 = new MemoryStream(bytesUncompressed);
gi = (게임정보클래스)_binary_formatter.Deserialize(m_msBZip2);
m_isBZip2.Close();
m_msBZip2.Close();
reader.Close();
}
}
finally
{
if (m_isBZip2 != null)
{
m_isBZip2.Dispose();
}
if (m_msBZip2 != null)
{
m_msBZip2.Dispose();
}
}
#endif
_filestream.Close();
}
catch (Exception e)
{
//Debug.Log("----- " + e.Message);
_filestream.Close();
gi = new 게임정보클래스();
}
}
else
{
gi = new 게임정보클래스();
}
return gi;
}
위와 같이 사용했음. 안드로이드, 아이폰 시뮬레이터에서 작동 확인함.
아이폰 실기기에서 테스트하진 않았지만 문제없을걸로 판단됨.
참고사이트.
http://qiita.com/satotin/items/4bd0ff1a43c700278071
--------------------------------------------------------------------------------------------------------------------------------------------------
요근래의 SharpZipLib 버전은 net45 를 필요로 하는듯 합니다. 타깃프레임워크를 net20 으로 변경시 IncrementalHash 를 찾을 수 없다고 에러를 뱉네요
=======================
=======================
=======================
출처: https://nahyungmin.tistory.com/m/38?category=710360
유니티 통신용으로 호환될 수 있는 SharpZipLib 사용
using ICSharpCode.SharpZipLib.BZip2;
///
/// byte[] compress 압축
///
public byte[] GenericToByteZip(T generic)
{
MemoryStream buffer = new MemoryStream();
MemoryStream outBuffer = new MemoryStream();
protobuf.Serialize(buffer, ref generic);
buffer.Position = 0;
BZip2.Compress(buffer, outBuffer, false, 3);
return outBuffer.ToArray();
}
///
/// byte[] Decompress 압축해제
///
public T ByteZipGeneric(byte[] bytes)
{
MemoryStream buffer = new MemoryStream(bytes);
MemoryStream outBuffer = new MemoryStream();
//buffer.Position = 0;
BZip2.Decompress(buffer, outBuffer, false);
outBuffer.Position = 0;
return protobuf.Deserialize(outBuffer);
}
Colored by Color Scripter
cs
압축 해제 풀기
byte[] myTownBytes = serializerSharpZip.GenericToByteZip<타입>(압축 T);
serializerSharpZip.ByteZipGeneric<타입>(해제할 byte);
=======================
=======================
=======================
*기타관련링크
- https://youn-codingnote.tistory.com/8
- http://yeonhong.blogspot.com/2015/04/icsharpcodesharpziplib.html
- http://devkorea.co.kr/bbs/board.php?bo_table=m03_qna&wr_id=11612
- https://forum.unity.com/threads/extracting-zip-files.472537/
=======================
=======================
=======================
'게임엔진관련 > 유니티 엔진' 카테고리의 다른 글
[Unity] 유니티 로컬저장소, url 스트림, 파일(크기,읽기,저장위치, File,Data Path) 관련 (0) | 2019.07.09 |
---|---|
[Unity] 유니티 사운드, 소리 관련 (0) | 2019.07.08 |
[Unity] 유니티 SQLite 연동 관련 (1) | 2019.07.05 |
[Unity] 유니티 애니매이션(스프라이트, 오브젝트) 관련 (1) | 2019.07.05 |
[Unity] 유니티 InputField 컨텐츠 타입 패스워드 관련 (0) | 2019.07.04 |
댓글 영역