1 using System;
2 using System.Collections.Generic;
3 using System.Text;
4 using System.Xml;
5 using System.Data;
6 using System.IO;
7 using System.Runtime.Serialization.Formatters.Binary;
8 using zlib;
9
10 namespace com.integ.dyc.Compress
11 {
12 public class ZlibCompress
13 {
14 /**/
15 /// <summary>
16 /// Zlib压缩算法压缩应用类
17 /// </summary>
18 /**/
19 /// <summary>
20 /// 拷贝复制流字节
21 /// </summary>
22 /// <param name="input"></param>
23 /// <param name="output"></param>
24 private static void CopyStream(Stream input, Stream output)
25 {
26 byte[] buffer = new byte[2000];
27 int len;
28 while ((len = input.Read(buffer, 0, buffer.Length)) > 0)
29 {
30 output.Write(buffer, 0, len);
31 }
32 output.Flush();
33 }
34
35 /**/
36 /// <summary>
37 /// 压缩文件
38 /// </summary>
39 /// <param name="FileName">被压缩文件名(必须输入绝对路径)</param>
40 /// <param name="CompressedFileName">压缩后保存的文件名(必须输入绝对路径)</param>
41 /// <returns></returns>
42 public static bool CompressFile(string FileName, string CompressedFileName)
43 {
44 bool bResult = false;
45
46 FileStream outFileStream = new FileStream(CompressedFileName, FileMode.Create);
47 ZOutputStream outZStream = new ZOutputStream(outFileStream, zlibConst.Z_DEFAULT_COMPRESSION);
48 FileStream inFileStream = new FileStream(FileName, FileMode.Open);
49 try
50 {
51 CopyStream(inFileStream, outZStream);
52 bResult = true;
53 }
54 catch
55 {
56 bResult = false;
57 }
58 finally
59 {
60 outZStream.Close();
61 outFileStream.Close();
62 inFileStream.Close();
63 }
64 return bResult;
65 }
66
67 /**/
68 /// <summary>
69 /// 解压文件
70 /// </summary>
71 /// <param name="CompressedFileName">被解压文件名(必须输入绝对路径)</param>
72 /// <param name="DecompressFileName">解压后保存的文件名(必须输入绝对路径)</param>
73 /// <returns></returns>
74 public static bool DecompressFile(string CompressedFileName, string DecompressFileName)
75 {
76 bool bResult = false;
77 FileStream outFileStream = new FileStream(DecompressFileName, FileMode.Create);
78 ZOutputStream outZStream = new ZOutputStream(outFileStream);
79 FileStream inFileStream = new FileStream(CompressedFileName, FileMode.Open);
80 try
81 {
82 CopyStream(inFileStream, outZStream);
83 bResult = true;
84 }
85 catch
86 {
87 bResult = false;
88 }
89 finally
90 {
91 outZStream.Close();
92 outFileStream.Close();
93 inFileStream.Close();
94 }
95 return bResult;
96 }
97
98 /**/
99 /// <summary>
100 /// 压缩byte数组数据
101 /// </summary>
102 /// <param name="SourceByte">需要被压缩的Byte数组数据</param>
103 /// <returns></returns>
104 public static byte[] CompressBytes(byte[] SourceByte)
105 {
106 try
107 {
108 MemoryStream stmInput = new MemoryStream(SourceByte);
109 Stream stmOutPut = ZlibCompress.CompressStream(stmInput);
110 byte[] bytOutPut = new byte[stmOutPut.Length];
111 stmOutPut.Position = 0;
112 stmOutPut.Read(bytOutPut, 0, bytOutPut.Length);
113 return bytOutPut;
114 }
115 catch
116 {
117 return null;
118 }
119 }
120
121 /**/
122 /// <summary>
123 /// 解压byte数据数据
124 /// </summary>
125 /// <param name="SourceByte">需要被解压的byte数组数据</param>
126 /// <returns></returns>
127 public static byte[] DecompressBytes(byte[] SourceByte)
128 {
129 try
130 {
131 MemoryStream stmInput = new MemoryStream(SourceByte);
132 Stream stmOutPut = ZlibCompress.DecompressStream(stmInput);
133 byte[] bytOutPut = new byte[stmOutPut.Length];
134 stmOutPut.Position = 0;
135 stmOutPut.Read(bytOutPut, 0, bytOutPut.Length);
136 return bytOutPut;
137 }
138 catch
139 {
140 return null;
141 }
142 }
143
144 /**/
145 /// <summary>
146 /// 压缩流
147 /// </summary>
148 /// <param name="SourceStream">需要被压缩的流数据</param>
149 /// <returns></returns>
150 public static Stream CompressStream(Stream SourceStream)
151 {
152 try
153 {
154 MemoryStream stmOutTemp = new MemoryStream();
155 ZOutputStream outZStream = new ZOutputStream(stmOutTemp, zlibConst.Z_DEFAULT_COMPRESSION);
156 CopyStream(SourceStream, outZStream);
157 outZStream.finish();
158 return stmOutTemp;
159 }
160 catch
161 {
162 return null;
163 }
164 }
165
166 /**/
167 /// <summary>
168 /// 解压流
169 /// </summary>
170 /// <param name="SourceStream">需要被解缩的流数据</param>
171 /// <returns></returns>
172 public static Stream DecompressStream(Stream SourceStream)
173 {
174 try
175 {
176 MemoryStream stmOutput = new MemoryStream();
177 ZOutputStream outZStream = new ZOutputStream(stmOutput);
178 CopyStream(SourceStream, outZStream);
179 outZStream.finish();
180 return stmOutput;
181 }
182 catch
183 {
184 return null;
185 }
186 }
187
188 /**/
189 /// <summary>
190 /// 压缩字符串
191 /// </summary>
192 /// <param name="SourceString">需要被压缩的字符串</param>
193 /// <returns></returns>
194 public static string CompressString(string SourceString)
195 {
196 byte[] byteSource = System.Text.Encoding.UTF8.GetBytes(SourceString);
197 byte[] byteCompress = ZlibCompress.CompressBytes(byteSource);
198 if (byteCompress != null)
199 {
200 return Convert.ToBase64String(byteCompress);
201 }
202 else
203 {
204 return null;
205 }
206 }
207
208 /**/
209 /// <summary>
210 /// 解压字符串
211 /// </summary>
212 /// <param name="SourceString">需要被解压的字符串</param>
213 /// <returns></returns>
214 public static string DecompressString(string SourceString)
215 {
216 byte[] byteSource = Convert.FromBase64String(SourceString);
217 byte[] byteDecompress = ZlibCompress.DecompressBytes(byteSource);
218 if (byteDecompress != null)
219 {
220 return System.Text.Encoding.UTF8.GetString(byteDecompress);
221 }
222 else
223 {
224 return null;
225 }
226 }
227
228 }
229
230 }