想拥有一个自己的压缩算法实现很久了,但直到net2.0微软才开始提供官方的压缩算法。并且激动永远只是短暂的,作为智能开发的这一片,我们仿佛总是处于遗忘的角落。Net Compact framework (以下简单ncf) 1.0是不必说了,那是一个玩具,绝不是工具!ncf2有了较大改观,可以说这开始成为一种工具了。我们拥有了更多的功能,com的部分支持(但没有ActiveX控件及一些完整Com的功能)。但在System.IO命名空间,失望的我也没有找到Compression空间。。。

在对微软无视使用net精简版的我的需求,我在表达了最强烈的愤慨后,无奈地接受了这一现实。但我实在无法接受等待下一版ncf3的漫长等待,也许等待永远都意味着失望。我决定用行动改变这一切!

我查阅了net2的MSIL源程序,虽然逆向工程并不是一件伟大的事,但我认为我根据net完整版的源程序帮微软提供NCF2的扩充功能对微软应该不是什么坏事8)

System.IO.Compression处于net完整版那臃肿的system.dll中,接下来的事就不细说了,我痛苦地copy/paste并删除了一些ncf2不支持的属性,并将System.SR类合并入这个空间中,4 个小时后,我生成了和完整版功能一模一样的CECompression.dll(当然是一模一样啦,程序都是微软写的,我只是负责修正8))象普罗米修斯从宙斯控制下偷火一样,我将System.IO.Compression带到了幸福的智能开发世界。

在这儿你可以获得这个dll/Files/DreamlikeAttic/CECompression.rar。至于使用嘛,在项目中添加对这个dll的引用就可以了,帮助看msdn对System.IO.Compression的说明就行。。。。

这此我也提供一个使用这个dll的实用程序,可以对指定的源文件进行(压缩/解压缩)后得到目标文件。

完整代码如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.IO.Compression;

namespace testGzip
{
  public partial class Form1 : Form
  {
    public Form1()
    {
      InitializeComponent();

}

private void menuItem1_Click(object sender, EventArgs e)
    {
      this.Close();
    }

private void btnSelectSource_Click(object sender, EventArgs e)
    {
      dlgFileOpen.FileName = "";
      DialogResult tdlgResult = dlgFileOpen.ShowDialog();

if (tdlgResult == DialogResult.OK)
        txtSource.Text = dlgFileOpen.FileName;
      //end if

}//end sub

private void btnSelectDest_Click(object sender, EventArgs e)
    {
      dlgSaveFile.FileName = "";

DialogResult tdlgResult = dlgSaveFile.ShowDialog();

if (tdlgResult == DialogResult.OK)
        txtDest.Text = dlgSaveFile.FileName;
      //end if
    }

private void btnZip_Click(object sender, EventArgs e)
    {
      //开始压缩
      //先验证源文件名及目标文件名的正确性
      if (System.IO.File.Exists(txtSource.Text) == false)
      {
        MessageBox.Show("源文件名指定的文件不存在");
        txtSource.Focus();
        return;
      }//end if

if (System.IO.File.Exists(txtDest.Text) == true)
      {
        DialogResult tdlgResult = MessageBox.Show("指定的目标文件已存在,覆盖吗?",
                                                "文件覆盖确认", MessageBoxButtons.YesNo,
                                                MessageBoxIcon.Question,
                                                MessageBoxDefaultButton.Button1);

if (tdlgResult == DialogResult.No)
        {
          txtDest.Focus();
          return;
        }
      }//endif

bool tblnResult = FileGZipCompress(txtSource.Text, txtDest.Text);
      if (tblnResult == false)
        MessageBox.Show("压缩出现错误!压缩失败");
   
      //end if

}//end sub

bool FileGZipCompress(string ni_strSourceFile, string ni_strDestFile)
    {
     
      FileStream tobjSourceFileStream;
    
      MessageBox.Show("开始对"+txtSource.Text +"进行文件压缩");

try
      {
        // Open the file as a FileStream object.
        tobjSourceFileStream = new FileStream(ni_strSourceFile, FileMode.Open, FileAccess.Read, FileShare.Read);

byte[] taSourcebuffer = new byte[tobjSourceFileStream.Length];

// Read the file to ensure it is readable.
        int count = tobjSourceFileStream.Read(taSourcebuffer, 0, taSourcebuffer.Length);

if (count != taSourcebuffer.Length)
        {
          tobjSourceFileStream.Close();
          MessageBox.Show("压缩失败,不能读取指定的文件");
          return false ;
        }
        tobjSourceFileStream.Close();

FileStream  tobjDestFileStream = new FileStream(ni_strDestFile,FileMode.Create,FileAccess.ReadWrite  );// new MemoryStream();

MemoryStream tobjMemStream = new MemoryStream();

// 使用内存流进行压缩
        GZipStream compressedzipStream = new GZipStream(tobjMemStream, CompressionMode.Compress, true);

Cursor.Current = Cursors.WaitCursor;

//向压缩流写入要压缩的数据
        compressedzipStream.Write(taSourcebuffer, 0, taSourcebuffer.Length);
        //关闭压缩流
        compressedzipStream.Close();

//此处应该写入文件头信息,在此处简单写入一个文件长度
        tobjDestFileStream.Position = 0;
        tobjDestFileStream.Write(BitConverter.GetBytes(taSourcebuffer.Length),0,4);//写入4字节的文件长度

//定入压缩得到的实际数据
        tobjMemStream.WriteTo(tobjDestFileStream);
        tobjMemStream.Close();
        Cursor.Current = Cursors.Default;

MessageBox.Show("压缩完成.源文件大小为:\n" + taSourcebuffer.Length + "字节\n"
                        + "压缩后大小为" + tobjDestFileStream.Length + "字节\n"
                        + "压缩比为: " + (tobjDestFileStream.Length  / taSourcebuffer.Length*100)+" %");

tobjDestFileStream.Close();

return true;
      }
      catch
      {
        return false;
      }//end try

}//end sub

private bool FileGZipDecompress(string ni_strSourceFile, string ni_strDestFile)
    {
      //对指定的压缩文件进行解压缩
      FileStream tobjSourceFileStream;
      GZipStream tobjGzipStream = null;
      MemoryStream tobjMemStream ;

try
      {
        Cursor.Current = Cursors.WaitCursor;

tobjSourceFileStream = new FileStream(ni_strSourceFile, FileMode.Open, FileAccess.Read, FileShare.Read);
        //取得文件的原始长度
        byte[] tabytFileLength=new byte[4];
        tobjSourceFileStream.Read(tabytFileLength,0,4);
        int tintFileLength = BitConverter.ToInt32(tabytFileLength,0);
       
       
        byte[] tabyteDeCompressData=new byte[tobjSourceFileStream.Length-4];
        tobjSourceFileStream.Read(tabyteDeCompressData, 0, tabyteDeCompressData.Length);

tobjMemStream = new MemoryStream(tabyteDeCompressData);

tobjGzipStream = new GZipStream(tobjMemStream, CompressionMode.Decompress);

byte[] tabytBuffer = new byte[tintFileLength];

tobjGzipStream.Read( tabytBuffer, 0, tintFileLength );

tobjGzipStream.Close();
        tobjSourceFileStream.Close();

//将压缩的数据写入目标文件
        FileStream tobjDestFileStream = new FileStream(ni_strDestFile, FileMode.Create, FileAccess.ReadWrite,
                                   FileShare.None);

tobjDestFileStream.Write(tabytBuffer, 0, tabytBuffer.Length);

tobjDestFileStream.Close();

Cursor.Current = Cursors.Default;

return true;
      }
      catch
      {
        return false;
      }//end try

}//end sub

private void btnUnzip_Click(object sender, EventArgs e)
    {
      //开始解压缩
      //先验证源文件名及目标文件名的正确性
      if (System.IO.File.Exists(txtSource.Text) == false)
      {
        MessageBox.Show("源文件名指定的文件不存在");
        txtSource.Focus();
        return;
      }//end if

if (System.IO.File.Exists(txtDest.Text) == true)
      {
        DialogResult tdlgResult = MessageBox.Show("指定的目标文件已存在,覆盖吗?",
                                                "文件覆盖确认", MessageBoxButtons.YesNo,
                                                MessageBoxIcon.Question,
                                                MessageBoxDefaultButton.Button1);

if (tdlgResult == DialogResult.No)
        {
          txtDest.Focus();
          return;
        }
      }//endif

MessageBox.Show("开始对\"" + txtSource.Text + "\"进行文件解压缩");

bool tblnResult = FileGZipDecompress(txtSource.Text, txtDest.Text);
      if (tblnResult == false)
        MessageBox.Show("解压缩出现错误!解压缩失败");
      else
        MessageBox.Show("解压缩成功完成");
      //end if

}//end sub

}//end class

}//end namespace

你可以这儿获取相应的源程序包:/Files/DreamlikeAttic/CECompressionTest.rar

如移动设备开发感兴趣可以加入以下群24123368

入群需知:

1、不是编程开发人员请勿加入。

2、没时间讨论问题或喜欢潜水的请勿加入。

3、只想获得源程序的请勿加入

本blog文档,未经作者同意,谢绝转载。谢谢你对我的blog的访问.

联系方式: missilecat@163.com QQ:85403578

转载于:https://www.cnblogs.com/DreamlikeAttic/archive/2006/07/07/445643.html

在Pocket PC/Smartphone智能设备上编写压缩程序(特别简单,任何人都能简单使用)...相关推荐

  1. Pocket PC/Smartphone软件安装包之制作DIY

    Pocket PC/Smartphone软件安装包之制作DIY<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:of ...

  2. 如何在Hadoop上编写MapReduce程序

    1. 概述 1970年,IBM的研究员E.F.Codd博士在刊物<Communication of the ACM>上发表了一篇名为"A Relational Model of ...

  3. Eclipse helios 上编写arduino程序并进行烧录

    源:Eclipse helios 上编写arduino程序并进行烧录

  4. 如何在IDEA上编写Spark程序?(本地+集群+java三种模式书写代码)

    本篇博客,Alice为大家带来关于如何在IDEA上编写Spark程序的教程. 文章目录 写在前面 准备材料 图解WordCount pom.xml 本地执行 集群上运行 Java8版[了解] 写在前面 ...

  5. 手机上怎样压缩照片?分享一下双端简单的操作

    在平时使用照片的时候小伙伴们可能不会注意到什么,但是当长期未清理图片被提醒照片内存太大无法查看照片内容的时候就会发现,有些照片的内存占用实在太大了,由于现在手机像素越来越搞,拍出来的照片内存都能高达几 ...

  6. IDEA上编写hadoop程序(Maven)【笔记自用】

    说明:在IDEA上进行编写简单的hadoop程序,适用于个人简单入门 版本:IDEA2019.3.3 + Hadoop2.6 + java8 + win10 系列: 一,创建项目 1,创建项目 2,选 ...

  7. 如何在mac上编写java程序_在mac系统上安装Eclipse,编写java程序

    第一步:安装java jre(java 运行环境). 如图所示: 登陆Oralce官网,点击Download选项,找到如图所示界面: 选择Java Runtime Environment(JRE),打 ...

  8. 编写python程序 兀 3_帮忙写一个简单的python程序π_π 要求就是图上的那样 其实挺简单的但我就是写不出来。拜托了,...

    展开全部 要求提的不是很明确,按照最简单的功能来做了. 只记录姓名和电话号码62616964757a686964616fe78988e69d8331333337626138,没有做号码检验.也没有做保 ...

  9. python编写加密程序_用Python实现一个简单的加密程序

    生活中,有时候我们需要对一些重要的文件进行加密,Python 提供了诸如 hashlib,base64 等便于使用的加密库. 对于日常学习而言,我们可以借助异或操作,实现一个简单的文件加密程序,从而强 ...

最新文章

  1. 2022-2028年中国服装电商行业发展战略规划及投资方向研究报告
  2. GridView合并列下的行单元格的方法
  3. Mysql主从配置,实现读写分离
  4. 07-狄克斯特拉算法
  5. MetaModelEngine:域模型定义
  6. python之质数判断
  7. (计算机显示器主屏幕区域)桌面造句,部编版《语文园地四》教学反思模板(11页)-原创力文档...
  8. android打开相机拍照及打开相册选择照片
  9. 39种语言编写的Hello World程序
  10. [转]coolfire黑客入门教程系列之(三)
  11. 群站SEO之群站与链轮之不可告人的秘密
  12. mysql数据库实验4
  13. h5 右下角浮动按钮_基于javascript实现右下角浮动广告效果
  14. Ring3触发BSOD代码实现及内核逆向分析
  15. 自动驾驶常用传感器介绍
  16. 感受Java的魅力——基于Java二维数组和if语句编制的税后工资计算方法
  17. 怎么样开启移动热点?看我操作,简单开启
  18. 智商高的人都不爱说话,程序员也是如此吗?
  19. Python 下载视频出错 you-get: [error] oops, something went wrong.
  20. ESP8266-Arduino编程实例-TMP102数字温度传感器驱动

热门文章

  1. Datawhale 零基础入门CV赛事-Task2 数据读取与数据扩增
  2. 短实体,长句实体抽取
  3. python3+Neo4j+flask,汽车行业知识图谱项目实战
  4. 及时复盘的好处_还不会复盘?这篇有最全的复盘介绍
  5. 高斯过程回归python_scikit-learn中的多输出高斯过程回归
  6. python 视频分析_成为视频分析专家:自动生成集锦的方法(Python实现)
  7. data-index在react里怎样表达_对牛弹琴,在英语里该怎样地道表达?
  8. pytorch之学习率变化策略之MultiplicativeLR
  9. docker update_windows 10 安装docker
  10. [翻译]关于Swift的编译时间优化