2016년 7월 18일 월요일

유니티에서 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

댓글 1개:

  1. 요근래의 SharpZipLib 버전은 net45 를 필요로 하는듯 합니다. 타깃프레임워크를 net20 으로 변경시 IncrementalHash 를 찾을 수 없다고 에러를 뱉네요

    답글삭제