Windows mobile 上的文件压缩

using  System;
using  System.Linq;
using  System.Collections.Generic;
using  System.ComponentModel;
using  System.Data;
using  System.Drawing;
using  System.Text;
using  System.Windows.Forms;
using  ICSharpCode.SharpZipLib.Checksums;
using  ICSharpCode.SharpZipLib.Zip;
using  ICSharpCode.SharpZipLib.GZip;
using  System.IO;

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

        
public   void  ZipFile( string  strFile,  string  strZip)
    {
        
if  (strFile[strFile.Length  -   1 !=  Path.DirectorySeparatorChar)
            strFile 
+=  Path.DirectorySeparatorChar;
        ZipOutputStream s 
=   new  ZipOutputStream(File.Create(strZip));
        s.SetLevel(
6 );  //  0 - store only to 9 - means best compression
        zip(strFile, s, strFile);
        s.Finish();
        s.Close();
    }

         
private   void  zip( string  strFile, ZipOutputStream s,  string  staticFile)
    {
        
if  (strFile[strFile.Length  -   1 !=  Path.DirectorySeparatorChar) strFile  +=  Path.DirectorySeparatorChar;
        Crc32 crc 
=   new  Crc32();
        
string [] filenames  =  Directory.GetFileSystemEntries(strFile);
        
foreach  ( string  file  in  filenames)
        {

            
if  (Directory.Exists(file))
            {
                zip(file, s, staticFile);
            }

            
else   //  否则直接压缩文件
            {
                
// 打开压缩文件
                FileStream fs  =  File.OpenRead(file);

                
byte [] buffer  =   new   byte [fs.Length];
                fs.Read(buffer, 
0 , buffer.Length);
                
string  tempfile  =  file.Substring(staticFile.LastIndexOf( " \\ " +   1 );
                ZipEntry entry 
=   new  ZipEntry(tempfile);

                entry.DateTime 
=  DateTime.Now;
                entry.Size 
=  fs.Length;
                fs.Close();
                crc.Reset();
                crc.Update(buffer);
                entry.Crc 
=  crc.Value;
                s.PutNextEntry(entry);

                s.Write(buffer, 
0 , buffer.Length);
            }
        }
    }
         
public   static  String GetCurPath()
         {
             
return  System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase);
         }



        
///   <summary>
        
///   ////////////////////////////////////////// /
        
///   </summary>
        
///   <param name="sender"></param>
        
///   <param name="e"></param>
        
///  


        
public   string  unZipFile( string  TargetFile,  string  fileDir)
    {
        
string  rootFile  =   "   " ;
        
try
        {
            
// 读取压缩文件(zip文件),准备解压缩
            ZipInputStream s  =   new  ZipInputStream(File.OpenRead(TargetFile.Trim()));
            ZipEntry theEntry;
            
string  path  =  fileDir;                   
            
// 解压出来的文件保存的路径

            
string  rootDir  =   "   " ;                        
            
// 根目录下的第一个子文件夹的名称
             while  ((theEntry  =  s.GetNextEntry())  !=   null )
            {
                rootDir 
=  Path.GetDirectoryName(theEntry.Name);                          
                
// 得到根目录下的第一级子文件夹的名称
                 if  (rootDir.IndexOf( " \\ " >=   0 )
                {
                    rootDir 
=  rootDir.Substring( 0 , rootDir.IndexOf( " \\ " +   1 );
                }
                
string  dir  =  Path.GetDirectoryName(theEntry.Name);                    
                
// 根目录下的第一级子文件夹的下的文件夹的名称
                 string  fileName  =  Path.GetFileName(theEntry.Name);                    
                
// 根目录下的文件名称
                 if  (dir  !=   "   "  )                                                        
                    
// 创建根目录下的子文件夹,不限制级别
                {
                    
if  ( ! Directory.Exists(fileDir  +   " \\ "   +  dir))
                    {
                        path 
=  fileDir  +   " \\ "   +  dir;                                                
                        
// 在指定的路径创建文件夹
                        Directory.CreateDirectory(path);
                    }
                }
                
else   if  (dir  ==   "   "   &&  fileName  !=   "" )                                              
                    
// 根目录下的文件
                {
                    path 
=  fileDir;
                    rootFile 
=  fileName;
                }
                
else   if  (dir  !=   "   "   &&  fileName  !=   "" )                                              
                    
// 根目录下的第一级子文件夹下的文件
                {
                    
if  (dir.IndexOf( " \\ " >   0 )                                                            
                        
// 指定文件保存的路径
                    {
                        path 
=  fileDir  +   " \\ "   +  dir;
                    }
                }

                
if  (dir  ==  rootDir)                                                                                  
                    
// 判断是不是需要保存在根目录下的文件
                {
                    path 
=  fileDir  +   " \\ "   +  rootDir;
                }

                
// 以下为解压缩zip文件的基本步骤
                
// 基本思路就是遍历压缩文件里的所有文件,创建一个相同的文件。
                 if  (fileName  !=  String.Empty)
                {
                    FileStream streamWriter 
=  File.Create(path  +   " \\ "   +  fileName);

                    
int  size  =   2048 ;
                    
byte [] data  =   new   byte [ 2048 ];
                    
while  ( true )
                    {
                        size 
=  s.Read(data,  0 , data.Length);
                        
if  (size  >   0 )
                        {
                            streamWriter.Write(data, 
0 , size);
                        }
                        
else
                        {
                            
break ;
                        }
                    }

                    streamWriter.Close();
                }
            }
            s.Close();

            
return  rootFile;
        }
        
catch  (Exception ex)
        {
            
return   " 1;  "   +  ex.Message;
        }
    }   



        
//////////////////////////////////////////////////////

         
private   void  Form1_Load( object  sender, EventArgs e)
         {
            

         }

         
private   void  button1_Click( object  sender, EventArgs e)
         {
             
string [] FileProperties  =   new   string [ 2 ];
             FileProperties[
0 =  Form1.GetCurPath()  +   " \\zip\\ " ; // 待压缩文件目录
             FileProperties[ 1 =  Form1.GetCurPath()  +   " \\mao\\a.zip " ;   // 压缩后的目标文件
             Form1 Zc  =   new  Form1();
             Zc.ZipFile(FileProperties[
0 ], FileProperties[ 1 ]);
             MessageBox.Show(
" OK " );
         }

         
private   void  button2_Click( object  sender, EventArgs e)
         {
            
string [] FileProperties  =   new   string [ 2 ];
            FileProperties[
0 =  Form1.GetCurPath()  +   " \\mao\\a.zip " ; // 待压缩文件目录
            FileProperties[ 1 =  Form1.GetCurPath()  +   " \\ " ;   // 压缩后的目标文件
            Form1 UnZc  =   new  Form1();
            UnZc.unZipFile(FileProperties[
0 ], FileProperties[ 1 ]);
            MessageBox.Show(
" OK " );

         }


    }
}

/Files/tt_mc/SmartDeviceProject1.rar

资源下载链接为: https://pan.quark.cn/s/9e7ef05254f8 行列式是线性代数的核心概念,在求解线性方程组、分析矩阵特性以及几何计算中都极为关键。本教程将讲解如何用C++实现行列式的计算,重点在于如何输出分数形式的结果。 行列式定义如下:对于n阶方阵A=(a_ij),其行列式由主对角线元素的乘积,按行或列的奇偶性赋予正负号后求和得到,记作det(A)。例如,2×2矩阵的行列式为det(A)=a11×a22-a12×a21,而更高阶矩阵的行列式可通过Laplace展开或Sarrus规则递归计算。 在C++中实现行列式计算时,首先需定义矩阵类或结构体,用二维数组存储矩阵元素,并实现初始化、加法、乘法、转置等操作。为支持分数形式输出,需引入分数类,包含分子和分母两个整数,并提供与整数、浮点数的转换以及加、减、乘、除等运算。C++中可借助std::pair表示分数,或自定义结构体并重载运算符。 计算行列式的函数实现上,3×3及以下矩阵可直接按定义计算,更大矩阵可采用Laplace展开或高斯 - 约旦消元法。Laplace展开是沿某行或列展开,将矩阵分解为多个小矩阵的行列式乘积,再递归计算。在处理分数输出时,需注意避免无限循环和除零错误,如在分数运算前先约简,确保分子分母互质,且所有计算基于整数进行,最后再转为浮点数,以避免浮点数误差。 为提升代码可读性和可维护性,建议采用面向对象编程,将矩阵类和分数类封装,每个类有明确功能和接口,便于后续扩展如矩阵求逆、计算特征值等功能。 总结C++实现行列式计算的关键步骤:一是定义矩阵类和分数类;二是实现矩阵基本操作;三是设计行列式计算函数;四是用分数类处理精确计算;五是编写测试用例验证程序正确性。通过这些步骤,可构建一个高效准确的行列式计算程序,支持分数形式计算,为C++编程和线性代数应用奠定基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值