压缩解压缩文件和文件夹(二)

// 续 压缩解压缩文件和文件夹(一)




// 文件名: ZipImplement.cpp
// 创建者: 
// 创建日期: 2014-05-12 下午 05:11:23 
// 
// 说明:压缩解压缩文件夹\文件 
/


#include "StdAfx.h"
#include "zipimplement.h"


#include <vector>
#include "zip.h"
#include "unzip.h"




CZipImplement::CZipImplement(void)
{


}


CZipImplement::~CZipImplement(void)
{


}



// 函数说明: 实现压缩文件\文件夹操作
// 参数说明: [in]: pFilePath         要被压缩的文件\文件夹
//                  mZipFileFullPath  压缩后的文件名和路径
// 返回值: 参数有误的情况下返回FALSE,压缩成功后返回TRUE
// 函数作者: 
// 创建日期: 2014-05-12 下午 05:21:23 

BOOL CZipImplement::ZipPackFiles(CString& pFilePath, CString& mZipFileFullPath, BOOL bIsFolder/*=false*/)
{
    // 参数错误
    if ((pFilePath == L"") || (mZipFileFullPath == L""))
    {
        // 路径异常返回
        return FALSE;
    }
CFileFind zIpFind;
    if (!zIpFind.FindFile(mZipFileFullPath))
    {
        // 压缩文件已经存在,先删除
        DeleteFile(mZipFileFullPath);
    }


CString tZipFilePath = "";
if (bIsFolder) // 文件夹的情况
{
if (!CZipImplement::FolderExist(pFilePath))
{
// 要被压缩的文件夹不存在
return FALSE;
}


tZipFilePath = mZipFileFullPath.Left(mZipFileFullPath.ReverseFind('/') + 1);
if(!CZipImplement::FolderExist(tZipFilePath))
{
// ZIP文件存放的文件夹不存在创建它
wchar_t* temp= (wchar_t*)tZipFilePath.GetBuffer(tZipFilePath.GetLength());
if (FALSE == CreatedMultipleDirectory(temp))
{
// 创建目录失败
return FALSE;
}
}
// 获得文件夹的名字
if(pFilePath.Right(1) == "/")
{
this->m_FolderPath = pFilePath.Left(pFilePath.GetLength() - 1); 
m_FolderName = m_FolderPath.Right(m_FolderPath.GetLength() - m_FolderPath.ReverseFind('/') - 1);
}
else
{
this->m_FolderPath = pFilePath;
m_FolderName = pFilePath.Right(pFilePath.GetLength() - pFilePath.ReverseFind('/') - 1);
}
}


    /************************************************************************/
    // 创建ZIP文件
    hz = CreateZip(mZipFileFullPath, 0);
    if (hz == 0)
    {
        // 创建Zip文件失败
        return FALSE;
    }
    // 递归文件夹,将获取的问价加入ZIP文件
if (bIsFolder)
{
BrowseFile(pFilePath);
}
else
{
CString subPath = "";
GetRelativePath(pFilePath, subPath);
// 需要再减一级目录
int nPos = subPath.ReverseFind('/');
subPath = subPath.Right(subPath.GetLength()-nPos-1);
// 将文件添加到ZIP文件
ZipAdd(hz, subPath, pFilePath);
}
    // 关闭ZIP文件
    CloseZip(hz);
    /************************************************************************/
    CFileFind tFFind;
    if (!tFFind.FindFile(mZipFileFullPath))
    {
        // 压缩失败(未发现压缩后的文件)
        return FALSE;
    }
    return TRUE;
}



// 函数说明: 解压缩文件夹
// 参数说明: [in]: mUnPackPath     解压后文件存放的路径
//                  mZipFileFullPath  ZIP文件的路径 
// 返回值: 
// 函数作者: 
// 创建日期: 2014-05-12 下午 05:21:23
/
BOOL CZipImplement::ZipUnPackFiles(CString &mZipFileFullPath, CString& mUnPackPath, BOOL bIsFolder/*=false*/)
{
    // 参数错误
    if ((mUnPackPath == L"") || (mZipFileFullPath == L""))
    {
        // 路径异常返回
        return FALSE;
    }
    CFileFind tFFind;
    if (!tFFind.FindFile(mZipFileFullPath))
    {
        // 压缩失败(未发现压缩文件)
        return FALSE;
    }
    // 如果解压缩的路径不存在 试图创建它
    CString tZipFilePath = mUnPackPath;
    if(!CZipImplement::FolderExist(tZipFilePath))
    {
        // 解压后存放的文件夹不存在 创建它
        wchar_t* temp = (wchar_t*)tZipFilePath.GetBuffer(tZipFilePath.GetLength());
        if (FALSE == CreatedMultipleDirectory(temp))
        {
            // 创建目录失败
            return FALSE;
        }
    }
    /************************************************************************/ 
    // 打开ZIP文件
    hz = OpenZip(mZipFileFullPath, 0);
    if (hz == 0)
    {
        // 打开Zip文件失败
        return FALSE;
    }
    zr = SetUnzipBaseDir(hz, mUnPackPath);
    if (zr != ZR_OK)
    {
        // 打开Zip文件失败
        CloseZip(hz);
        return FALSE;
    }
    zr = GetZipItem(hz, -1, &ze);
    if(zr != ZR_OK)
    {
        // 获取Zip文件内容失败
        CloseZip(hz);
        return FALSE;
    }
    int numitems = ze.index;
    for (int i=0; i < numitems;i++)   
{
        zr = GetZipItem(hz, i, &ze);
        zr = UnzipItem(hz, i, ze.name);
        if (zr != ZR_OK)
        {
            // 获取Zip文件内容失败
            CloseZip(hz);
            return FALSE;
        }
    }
    CloseZip(hz);
    return TRUE;
}



// 函数说明: 检查指定的文件夹是否存在 
// 参数说明: [in]:strPath 检查的文件夹 (此方法会主动向路径末尾添加*.*) 
// 返回值: BOOL类型,存在返回TRUE,否则为FALSE 
// 函数作者: 
// 创建日期: 2014-05-12 下午 05:34:43 

BOOL CZipImplement::FolderExist(CString& strPath)
{
    CString sCheckPath = strPath;
    if (sCheckPath.Right(1) != "/")
        sCheckPath += "/";
    sCheckPath += "*.*";


    WIN32_FIND_DATA wfd;
    BOOL rValue = FALSE;
    HANDLE hFind = FindFirstFile(sCheckPath, &wfd);
    if ((hFind!=INVALID_HANDLE_VALUE) &&
        (wfd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY) || (wfd.dwFileAttributes&FILE_ATTRIBUTE_ARCHIVE))
    {
        // 如果存在并类型是文件夹
        rValue = TRUE;
    }
    FindClose(hFind);
    return rValue;
}


/
// 函数说明: 遍历文件夹
// 参数说明: [in]:strFile 遍历的文件夹(此方法会主动向路径末尾添加*.*)
// 返回值:BOOL类型,存在返回TRUE,否则为FALSE
// 函数作者: 
// 创建日期: 2014-05-12 下午 05:44:52
/
void CZipImplement::BrowseFile(CString &strFile)
{
    CFileFind ff;
    CString szDir = strFile;
    if (szDir.Right(1) != "/")
        szDir += "/";
    szDir += "*.*";
    BOOL res = ff.FindFile(szDir);
    while (res)
    {
        res = ff.FindNextFile();
if (ff.IsDots())
{
            continue;
}
        if (ff.IsDirectory() && !ff.IsDots())
        {
            // 如果是一个子目录,用递归继续往深一层找
            CString strPath = ff.GetFilePath();
            CString subPath;
            GetRelativePath(strPath, subPath);
            // 将文件添加到ZIP文件
            ZipAddFolder(hz, subPath);
            BrowseFile(strPath);
        }
        else if (!ff.IsDirectory() && !ff.IsDots())
        {
            // 显示当前访问的文件(完整路径)
            CString strPath = ff.GetFilePath();
            CString subPath = "";
            GetRelativePath(strPath, subPath);
            // 将文件添加到ZIP文件
            ZipAdd(hz, subPath, strPath);
        }
    }
    // 关闭
    ff.Close(); 
}



// 函数说明: 获取相对路径 
// 参数说明: [in]:pFullPath 当前文件的完整路径 [out] : 解析后的相对路径 
// 函数作者: 
// 创建日期: 2014-05-12 下午 05:57:13 

void CZipImplement::GetRelativePath(CString& pFullPath,CString& pSubString)
{
    pSubString = pFullPath.Right(pFullPath.GetLength() - this->m_FolderPath.GetLength() + this->m_FolderName.GetLength());
}



// 函数说明: 创建多级目录 
// 参数说明: [in]: 路径字符串 
// 返回值: BOOL 成功True 失败False 
// 函数作者: 
// 创建日期: 2014-05-12 下午 07:14:53 

BOOL CZipImplement::CreatedMultipleDirectory(wchar_t* direct) 
{
    std::wstring Directoryname = direct;
    if (Directoryname[Directoryname.length() - 1] != '/')
    {
        Directoryname.append(1, '/');
    }
    std::vector<std::wstring> vpath;
    std::wstring strtemp;
    BOOL  bSuccess = FALSE;
    for (int i = 0; i < Directoryname.length(); i++)
    {
        if (Directoryname[i] != '/')
        {
            strtemp.append(1,Directoryname[i]);
        }
        else
        {
            vpath.push_back(strtemp);
            strtemp.append(1, '/');
        }
    }
    
    std::vector<std::wstring>::const_iterator vIter;
    for (vIter = vpath.begin() ; vIter != vpath.end(); vIter++)
    {
bSuccess = CreateDirectory((const char*)vIter->c_str(), NULL) ? TRUE :FALSE; 
    }
    return bSuccess;
}



// 未完,待续。。。

package com.example.tigongzhe; import android.R.integer; import android.content.ContentProvider; import android.content.ContentUris; import android.content.ContentValues; import android.content.Context; import android.content.UriMatcher; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.database.sqlite.SQLiteOpenHelper; import android.net.Uri; import android.provider.SyncStateContract.Helpers; import android.text.Selection; import android.util.Log; public class provider extends ContentProvider { private MyOpenHelper myOpenHelper; private SQLiteDatabase sqLiteDatabase; private static final UriMatcher URI_MATCHER=new UriMatcher(UriMatcher.NO_MATCH); private final String TAG="provider"; private static final String authority="com.example.tigongzhe.provider"; static { URI_MATCHER.addURI(authority, "contacter", 1); URI_MATCHER.addURI(authority, "contacter/#", 2); } private static final String _id="id"; private static final String name="name"; private static final String num="num"; @Override public boolean onCreate() { // TODO Auto-generated method stub myOpenHelper=new MyOpenHelper(getContext(), DB_Name, null, version_1); return true; } @Override public String getType(Uri uri) { // TODO Auto-generated method stub int flag=URI_MATCHER.match(uri); switch (flag) { case 2: return "vnd.android.cursor.item/contacter"; case 1: return "vnd.android.dir.item/contacter"; default: throw new IllegalArgumentException("异常参数"); } } @Override public Uri insert(Uri uri, ContentValues values) { // TODO Auto-generated method stub sqLiteDatabase=myOpenHelper.getWritableDatabase(); int flag=URI_MATCHER.match(uri); switch (flag) { case 1: sqLiteDatabase.insert(Table_Name, name, values); break; case 2: long id=sqLiteDatabase.insert(Table_Name, name, values); ContentUris.withAppendedId(uri, id); default: break; } return uri; } @Override public Cursor query(Uri uri, String[] arg1, String arg2, String[] arg3, String arg4) { // TODO Auto-generated method stub Cursor cursor; sqLiteDatabase=myOpenHelper.getReadableDatabase(); int flag=URI_MATCHER.match(uri); switch (flag) { case 1: cursor=sqLiteDatabase.query(Table_Name, arg1, arg2, arg3, null, null,arg4); break; case 2: long id=ContentUris.parseId(uri); arg2=(arg2==null||"".equals(arg2.trim()))? _id+"="+id:arg2+"and"+_id+"="+id; cursor=sqLiteDatabase.query(Table_Name, arg1, arg2, arg3, null, null,arg4); default: throw new IllegalArgumentException("参数错误"); } return cursor; } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { // TODO Auto-generated method stub int num=0; sqLiteDatabase=myOpenHelper.getWritableDatabase(); int flag=URI_MATCHER.match(uri); switch (flag) { case 1: num=sqLiteDatabase.update(Table_Name, values,selection, selectionArgs); break; case 2: long id=ContentUris.parseId(uri); selection=(selection==null||"".equals(selection.trim()))? _id+"="+id:selection+"and"+_id+"="+id; num=sqLiteDatabase.update(Table_Name, values,selection, selectionArgs); default: break; } return num; } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { // TODO Auto-generated method stub int num=0; sqLiteDatabase=myOpenHelper.getWritableDatabase(); int flag=URI_MATCHER.match(uri); switch (flag) { case 1: num=sqLiteDatabase.delete(Table_Name, selection, selectionArgs); break; case 2: long id=ContentUris.parseId(uri); selection=(selection==null||"".equals(selection.trim()))?_id+"="+id:selection+"and"+_id+"="+id; num=sqLiteDatabase.delete(Table_Name, selection, selectionArgs); default: throw new IllegalArgumentException("异常参数"); } return num; } private final String DB_Name = "mydb.db"; private final String Table_Name="contacter"; private final int version_1=1; private class MyOpenHelper extends SQLiteOpenHelper { public MyOpenHelper(Context context, String name, CursorFactory factory, int version) { super(context, name, factory, version); } /** * @description 当数据表无连接时创建新的表 */ @Override public void onCreate(SQLiteDatabase db) { String sql = " create table if not exists " + Table_Name + "(id INTEGER PRIMARY KEY AUTOINCREMENT," + "name varchar(64),num varchar(64))"; db.execSQL(sql); } /** * @description 当版本更新时触发的方法 */ @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { String sql = " drop table if exists " + Table_Name; db.execSQL(sql); onCreate(db); } } } +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.tigongzhe" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="18" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.tigongzhe.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <provider android:name=".provider" android:authorities="com.example.tigongzhe.provider" android:multiprocess="true" android:exported="true" android:permission="com.example.tigongzhe.permission" ></provider> </application> <permission android:name="com.example.tigongzhe.permission" android:protectionLevel="normal"></permission> </manifest> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++package com.example.tigongzhe; import android.R.integer; import android.content.ContentProvider; import android.content.ContentUris; import android.content.ContentValues; import android.content.Context; import android.content.UriMatcher; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.database.sqlite.SQLiteOpenHelper; import android.net.Uri; import android.provider.SyncStateContract.Helpers; import android.text.Selection; import android.util.Log; public class provider extends ContentProvider { private MyOpenHelper myOpenHelper; private SQLiteDatabase sqLiteDatabase; private static final UriMatcher URI_MATCHER=new UriMatcher(UriMatcher.NO_MATCH); private final String TAG="provider"; private static final String authority="com.example.tigongzhe.provider"; static { URI_MATCHER.addURI(authority, "contacter", 1); URI_MATCHER.addURI(authority, "contacter/#", 2); } private static final String _id="id"; private static final String name="name"; private static final String num="num"; @Override public boolean onCreate() { // TODO Auto-generated method stub myOpenHelper=new MyOpenHelper(getContext(), DB_Name, null, version_1); return true; } @Override public String getType(Uri uri) { // TODO Auto-generated method stub int flag=URI_MATCHER.match(uri); switch (flag) { case 2: return "vnd.android.cursor.item/contacter"; case 1: return "vnd.android.dir.item/contacter"; default: throw new IllegalArgumentException("异常参数"); } } @Override public Uri insert(Uri uri, ContentValues values) { // TODO Auto-generated method stub sqLiteDatabase=myOpenHelper.getWritableDatabase(); int flag=URI_MATCHER.match(uri); switch (flag) { case 1: sqLiteDatabase.insert(Table_Name, name, values); break; case 2: long id=sqLiteDatabase.insert(Table_Name, name, values); ContentUris.withAppendedId(uri, id); default: break; } return uri; } @Override public Cursor query(Uri uri, String[] arg1, String arg2, String[] arg3, String arg4) { // TODO Auto-generated method stub Cursor cursor; sqLiteDatabase=myOpenHelper.getReadableDatabase(); int flag=URI_MATCHER.match(uri); switch (flag) { case 1: cursor=sqLiteDatabase.query(Table_Name, arg1, arg2, arg3, null, null,arg4); break; case 2: long id=ContentUris.parseId(uri); arg2=(arg2==null||"".equals(arg2.trim()))? _id+"="+id:arg2+"and"+_id+"="+id; cursor=sqLiteDatabase.query(Table_Name, arg1, arg2, arg3, null, null,arg4); default: throw new IllegalArgumentException("参数错误"); } return cursor; } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { // TODO Auto-generated method stub int num=0; sqLiteDatabase=myOpenHelper.getWritableDatabase(); int flag=URI_MATCHER.match(uri); switch (flag) { case 1: num=sqLiteDatabase.update(Table_Name, values,selection, selectionArgs); break; case 2: long id=ContentUris.parseId(uri); selection=(selection==null||"".equals(selection.trim()))? _id+"="+id:selection+"and"+_id+"="+id; num=sqLiteDatabase.update(Table_Name, values,selection, selectionArgs); default: break; } return num; } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { // TODO Auto-generated method stub int num=0; sqLiteDatabase=myOpenHelper.getWritableDatabase(); int flag=URI_MATCHER.match(uri); switch (flag) { case 1: num=sqLiteDatabase.delete(Table_Name, selection, selectionArgs); break; case 2: long id=ContentUris.parseId(uri); selection=(selection==null||"".equals(selection.trim()))?_id+"="+id:selection+"and"+_id+"="+id; num=sqLiteDatabase.delete(Table_Name, selection, selectionArgs); default: throw new IllegalArgumentException("异常参数"); } return num; } private final String DB_Name = "mydb.db"; private final String Table_Name="contacter"; private final int version_1=1; private class MyOpenHelper extends SQLiteOpenHelper { public MyOpenHelper(Context context, String name, CursorFactory factory, int version) { super(context, name, factory, version); } /** * @description 当数据表无连接时创建新的表 */ @Override public void onCreate(SQLiteDatabase db) { String sql = " create table if not exists " + Table_Name + "(id INTEGER PRIMARY KEY AUTOINCREMENT," + "name varchar(64),num varchar(64))"; db.execSQL(sql); } /** * @description 当版本更新时触发的方法 */ @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { String sql = " drop table if exists " + Table_Name; db.execSQL(sql); onCreate(db); } } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值