⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rlezip.cpp

📁 压缩及解压基本工具
💻 CPP
字号:
// rlezip.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <windows.h>
#include <iostream.h>
#include <fstream.h>
#include <string.h>
#include <stdio.h>
char contents[10000000];
char ziped[10000000];

void addToZipFile(char *zipFileName, char *newContent);
void addDirToZipFile(char *zipFileName, char *dirName);
void addFileToZipFile(char *zipFileName, char *fileName);
void zip(char *source, long sourcelen, char *dest, long &destlen);

 int main(int argc, char* argv[])
{
	int i;
	// 创建压缩文件
	ofstream fout(argv[argc-1],ios::out);
	fout.close();
	// 将待压文件/目录逐一填入压缩文件
	for(i=1; i<=argc-2;i++)
       addToZipFile(argv[argc-1],argv[i]);
	return 0;
}
 
void addToZipFile(char *zipFileName, char *newContent){
    // 1. 如果是目录,调用 addDirToZipFile
    
    HANDLE  f1;                     // 句炳
    WIN32_FIND_DATA  fData;  //存储文件信息
    f1 = FindFirstFile(newContent,&fData);
	if((fData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) 
            == FILE_ATTRIBUTE_DIRECTORY)
	    addDirToZipFile(zipFileName, newContent);

	// 2. 如果是文件, 调用 addFileToZipFile
	else	  
		addFileToZipFile(zipFileName, newContent);
    FindClose(f1);
}

void addDirToZipFile(char *zipFileName, char *dirName){
    // 1. 写入目录头: 类型、目录名、包含文件个数 
	// 2. 逐一将包含的文件和子目录写入压缩文件 
    cout << "dir " << dirName << endl;
    char path[1000];
	if(strcmp(dirName,"*")==0) strcpy(path,"");
	else{
       strcpy(path,dirName);
	   for(int j=strlen(path)-1;j>=0;j--) 
	  	  if(path[j] == '\\') break; 
		  else path[j]='\0';
    }

	ofstream  fout(zipFileName, ios::ate|ios::binary);
    fout.seekp(0,ios::end);
	long b = fout.tellp();

    char type = 'd';
    fout.write(reinterpret_cast<const char *>(&type),sizeof(char));
    fout.write(reinterpret_cast<const char *>(dirName),256);
	long fileDirCount = 1;
    fout.write(reinterpret_cast<const char *>(&fileDirCount),sizeof(long));
    fout.close();
 
    HANDLE  f1;              // 句炳
    WIN32_FIND_DATA  fData;  //存储文件信息
    f1 = FindFirstFile(dirName,&fData);
    if((fData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) 
		== FILE_ATTRIBUTE_DIRECTORY){
		if(strcmp(fData.cFileName,".")!=0 && strcmp(fData.cFileName,"..")!=0){ 
		       char fName[1000];
			   sprintf(fName,"%s%s",path,fData.cFileName);
			   strcat(fName,"\\*");
	           addDirToZipFile(zipFileName, fName);
		}else fileDirCount --;
	}else{
		       char fName[1000];
			   sprintf(fName,"%s%s",path,fData.cFileName);
	           addFileToZipFile(zipFileName, fName);
    }	
	while(FindNextFile(f1,&fData)){
		fileDirCount ++;
	    if((fData.dwFileAttributes &
                   FILE_ATTRIBUTE_DIRECTORY) 
				   == FILE_ATTRIBUTE_DIRECTORY){
		    if(strcmp(fData.cFileName,".")!=0 && strcmp(fData.cFileName,"..")!=0){ 
		       char fName[1000];
			   sprintf(fName,"%s%s",path,fData.cFileName);
			   strcat(fName,"\\*");
	           addDirToZipFile(zipFileName, fName);
			}else fileDirCount --;
		}else{
		       char fName[1000];
			   sprintf(fName,"%s%s",path,fData.cFileName);
	           addFileToZipFile(zipFileName, fName);
		}
	}

	fout.open(zipFileName, ios::ate|ios::binary);
	fout.seekp(b,ios::beg);
    char fileType = 'd';
    fout.write(reinterpret_cast<const char *>(&fileType),sizeof(char));
    fout.write(reinterpret_cast<const char *>(dirName),256);
    fout.write(reinterpret_cast<const char *>(&fileDirCount),sizeof(long));
    fout.close();
    cout << "file No =" << fileDirCount << endl;
}

void addFileToZipFile(char *zipFileName, char *fileName){
    cout << "file " << fileName << endl;

	ofstream fout(zipFileName, ios::ate|ios::binary);
	fout.seekp(0,ios::end);
    char fileType = 'f';

    ifstream  f2(fileName, ios::binary|ios::in);
    f2.seekg(0,ios::end);
	long fileLength = f2.tellg();
    
    f2.seekg(0,ios::beg);
	f2.read(reinterpret_cast<char *>(contents),fileLength);
	//for(long k=0;k<fileLength;k++)
	 // f2.read(reinterpret_cast<char *>(&(contents[k])),1);
	f2.close();
	// compress
	long destlen;
	zip(contents,fileLength,ziped,destlen);
    
	fout.write(reinterpret_cast<const char *>(&fileType),sizeof(char));
    fout.write(reinterpret_cast<const char *>(fileName),256);
    fout.write(reinterpret_cast<const char *>(&destlen),sizeof(long));
	fout.write(reinterpret_cast<const char *>(ziped),destlen);
    fout.close();
}

void zip(char *source, long sourcelen, char *dest, long & destlen){
    long i;
    destlen = 0;
	char cur = source[0];
	int count = 0;
	for(i=0;i<sourcelen;i++){
		if(source[i] == cur){
			count ++;
			if(count == 127){
				dest[destlen] = (char)count;
				destlen ++;
				dest[destlen] = cur;
				destlen ++;
                count = 0;
			}
		}else{
			if(count >0 ){
				dest[destlen] = (char)count;
				destlen ++;
				dest[destlen] = cur;
				destlen ++;
			}
				cur = source[i];
                count = 1;
		}
	}
	if(count >0 ){
		dest[destlen] = (char)count;
		destlen ++;
		dest[destlen] = cur;
		destlen ++;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -