Files
CPXV2/SystemX.Net.CP.Platform/SystemX.Net.Platform/SystemX.Common/Archive.cs
2024-06-26 10:30:00 +09:00

142 lines
4.7 KiB
C#

using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.IO.Compression;
using System.Linq;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;
using System.Threading.Tasks;
// 데이터 압축/해제 관련
namespace SystemX.Common.Archive
{
public static class XDataArchive
{
public static byte[] CompressDeflateByteToByte(byte[] ucData)
{
byte[] ucCompressedByte;
using (MemoryStream ms = new MemoryStream())
{
using (DeflateStream ds = new DeflateStream(ms, CompressionMode.Compress))
{
ds.Write(ucData, 0, ucData.Length);
}
ucCompressedByte = ms.ToArray();
}
return ucCompressedByte;
}
public static byte[] CompressGZipByteToByte(byte[] ucData)
{
byte[] ucCompressedByte;
using (MemoryStream ms = new MemoryStream())
{
using (GZipStream gs = new GZipStream(ms, CompressionMode.Compress))
{
gs.Write(ucData, 0, ucData.Length);
}
ucCompressedByte = ms.ToArray();
}
return ucCompressedByte;
}
public static byte[] DecompressDeflateByteToByte(byte[] ucCompressedData)
{
byte[] ucDecompressedByte;
MemoryStream resultStream = new MemoryStream();
using (MemoryStream ms = new MemoryStream(ucCompressedData))
{
using (DeflateStream ds = new DeflateStream(ms, CompressionMode.Decompress))
{
ds.CopyTo(resultStream);
ds.Close();
ucDecompressedByte = resultStream.ToArray();
}
}
return ucDecompressedByte;
}
public static byte[] DecompressGZipByteToByte(byte[] ucCompressedData)
{
byte[] ucDecompressedByte;
MemoryStream resultStream = new MemoryStream();
using (MemoryStream ms = new MemoryStream(ucCompressedData))
{
using (GZipStream gs = new GZipStream(ms, CompressionMode.Decompress))
{
gs.CopyTo(resultStream);
gs.Close();
ucDecompressedByte = resultStream.ToArray();
}
}
return ucDecompressedByte;
}
public static byte[] CompressDatasetToByte(DataSet ds)
{
//1. 데이터셋 Serialize
ds.RemotingFormat = SerializationFormat.Binary;
BinaryFormatter bf = new BinaryFormatter();
MemoryStream ms = new MemoryStream();
bf.Serialize(ms, ds);
byte[] inbyt = ms.ToArray();
//2. 데이터 압축
System.IO.MemoryStream objStream = new MemoryStream();
System.IO.Compression.DeflateStream objZS = new System.IO.
Compression.DeflateStream(objStream, System.IO.Compression.
CompressionMode.Compress);
objZS.Write(inbyt, 0, inbyt.Length);
objZS.Flush();
objZS.Close();
//3. 데이터 리턴
return objStream.ToArray();
}
public static DataSet DecompressByteToDataset(byte[] bytDs)
{
DataSet outDs = new DataSet();
MemoryStream inMs = new MemoryStream(bytDs);
inMs.Seek(0, 0); //스트림으로 가져오기
//1. 압축객체 생성- 압축 풀기
DeflateStream zipStream = new DeflateStream(inMs,
CompressionMode.Decompress, true);
byte[] outByt = ReadFullStreamToByte(zipStream);
zipStream.Flush();
zipStream.Close();
MemoryStream outMs = new MemoryStream(outByt);
outMs.Seek(0, 0); //2. 스트림으로 다시변환
outDs.RemotingFormat = SerializationFormat.Binary;
//3. 데이터셋으로 Deserialize
BinaryFormatter bf = new BinaryFormatter();
outDs = (DataSet)bf.Deserialize(outMs, null);
return outDs;
}
private static byte[] ReadFullStreamToByte(Stream stream)
{
//스트림을 Byte 배열로 변환
byte[] buffer = new byte[1000000];
using (MemoryStream ms = new MemoryStream())
{
while (true)
{
int read = stream.Read(buffer, 0, buffer.Length);
if (read <= 0)
return ms.ToArray();
ms.Write(buffer, 0, read);
}
}
}
}
}