📄 rlezip.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 + -