C#中对文件压缩和可以使用两个类:
- GZipStream 类
此实例分为几个模块,分别为:
压缩函数:
/// <summary> /// 压缩文件 /// </summary> /// <param name="filename"></param> /// <param name="charData"></param> static void SaveCompressedFiles(string filename,string strinput) //这里不能使用 char[] 数组,因为输入的字符串的长度是不可知的 { FileStream fs = new FileStream(filename, FileMode.OpenOrCreate, FileAccess.Write); //两个参数分别为:1:要压缩或解压缩的流, 2:用于指示压缩还是解压缩流的枚举值之一。 GZipStream gzs = new GZipStream(fs, CompressionMode.Compress); //将流中的文件信息进行压缩 StreamWriter sw = new StreamWriter(gzs); //将压缩后的流 写入到文件中 sw.Write(strinput); sw.Close(); }
解压函数:
/// <summary> /// 解压文件 /// </summary> /// <param name="filename"></param> /// <returns></returns> static string LoadCompressedFiles(string filename) { FileStream fileStream = new FileStream(filename, FileMode.Open, FileAccess.Read); //将文件读进流 GZipStream gzipSream = new GZipStream(fileStream, CompressionMode.Decompress); //解压基础流 StreamReader sr = new StreamReader(gzipSream); string data = sr.ReadToEnd(); //从当前位置一直读到流的最后 return data; }
输出压缩后的长度函数:
/// <summary> /// 输出压缩后的长度 /// </summary> /// <param name="inputstring"></param> static void PrintfCompressedLenth(string inputstring) { SaveCompressedFiles("test.txt", inputstring); FileInfo fi = new FileInfo("test.txt"); long lenth = fi.Length; Console.WriteLine("压缩后的长度为:{0}", lenth); }
输出源的长度函数:
/// <summary> /// 输出源的长度 /// </summary> static void PrintSourceLenth() { string strOutput = LoadCompressedFiles("test.txt"); StreamWriter sw = new StreamWriter("temp.txt"); sw.Write(strOutput); sw.Close(); //必须关闭,否则下面的无法访问 FileStream fileS = new FileStream("temp.txt", FileMode.Open); StreamReader sr = new StreamReader(fileS); string line = sr.ReadLine(); Console.WriteLine("解压后的长度为:{0}", line.Length); }
获得用户输入的字符串数据函数:
/// <summary> /// 获得用户输入的字符串数据 /// </summary> /// <returns></returns> static string UserInputString() { Console.Write("请输入一个字符串:"); string str = Console.ReadLine(); StringBuilder strBuilder = new StringBuilder(str); for (int i = 0; i < 10; i++) //将字符串复制10次,注意这里是呈指数级别增加的 { strBuilder.Append(strBuilder); } Console.WriteLine("压缩前的长度为:{0}", strBuilder.Length); return strBuilder.ToString(); }
Main函数:
static void Main(string[] args) { try { //获取用户输入的字符串 string strInput = UserInputString(); //调用函数输出压缩后的长度 PrintfCompressedLenth(strInput); //调用函数 输出解压后(源文件)的文件长度 PrintSourceLenth(); } catch (System.Exception ex) { Console.WriteLine(ex.Message); } }
结果如下: