상세 컨텐츠

본문 제목

[Unity] 유니티 압축파일(zip등등) 풀기 읽기 관련

게임엔진관련/유니티 엔진

by AlrepondTech 2019. 7. 6. 23:06

본문

반응형

 

 

 

=======================

=======================

=======================

 

 

 

 

출처: http://blog.naver.com/PostView.nhn?blogId=yys3110&logNo=221384085570&categoryNo=24&parentCategoryNo=0&viewDate=¤tPage=1&postListTopCurrentPage=1&from=postView

 

 

유니티 설치폴더 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 이 답이었네요. 제가 플러그인에 대한 기본적인 이해가 안됐었네요. 

답변 선택은 처음 알려주신 세세님으로 해야겠네요.. 레온하트스퀄님께도 무쟈게 감사드립니다.

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

 

 

반응형

 

728x90

 

 

 

=======================

=======================

=======================

 

 

 

 

출처: 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/

 

 

=======================

=======================

=======================

 

 

반응형


관련글 더보기

댓글 영역