Delphi를 사용하여 파일 암호화 및 압축을 구현하십시오
저자 : e mengyuan (wnhoo)
메일 : [email protected]
사랑과 사랑
이 자세한 설명 파일을 다운로드하려면 클릭하십시오
개요 :
이 문서에서는 데이터 암호화, 데이터 압축 및 단일 파일의 자체 탈퇴 구현에 대해 이야기합니다. 마찬가지로, 약간의 수정으로 여러 파일 또는 폴더의 압축을 달성 할 수 있습니다.
키워드 : 암호화 압축, Zlib, 스트림, 리소스 파일
소개:
일상 생활에서 우리는 Winzip 및 Winrar와 같은 유명한 압축 소프트웨어를 사용해야합니다. 즉, 소프트웨어 개발 프로세스 중에 데이터 암호화 및 데이터 압축과 같은 문제가 필연적으로 발생합니다! 이 기사에서는이 기술적 인 문제에 대해 설명하며, 문제에 직면 할 때마다 모든 네티즌 덕분에 당신이 찾기 위해 열심히 노력한 기술은 항상 갑자기 명확하게 만들고 문제가 해결 될 것입니다. 이 기사는 주로 Delph의 강력한 스트림 처리 기술을 사용하여 데이터 암호화 및 압축을 달성하며 실제 소프트웨어 프로그램 개발에 사용됩니다.
1. 시스템 기능
1) 데이터 압축
Delphi (tcompressionstream 및 tdecompressionstream)가 제공 한 두 개의 스트림 클래스를 사용하여 데이터의 압축 및 감압을 완료하십시오.
2) 데이터 암호화 및 압축
데이터 암호화는 델파이 프로그래밍에서 "스트림"의 적용을 통해 실현되며, 주로 tfilestream 및 tmemorystream, 2 개의 파생 된 클래스의 TSTREAM은 1의 구현 방법을 채택한다.
3) 압축 파일을 두 번 클릭하여 자동으로 연관시키고 압축 압축을
레지스트리 확장과 프로그램 파일의 연관성을 변경함으로써 Tregistry는 주로 사용되며 API 기능은 등록 효과의 즉각적인 프리젠 테이션을 실현합니다.
4) 자체 추출 파일을 생성 할 수 있습니다
자체 압축 파일은 데이터 압축의 자동 감압 1) 및 데이터 암호화 압축 2) 및 자체 자체 탈선은 실행 가능한 자체 결정 파일 및 데이터 파일을 달성하기 위해 실현됩니다. 데이터의 자기 폐쇄가 달성됩니다.
2. 시스템 구현
2.1
2.2. 주요 설명
(i) zlib
1) 기본 클래스 tcustomzlibstream : tdecompressionstream 클래스의 기본 클래스는 주로 클래스의 압축 또는 감압 중에 발생합니다.
형식 : ProcessureOnProgress (sender : tobject); 동적;
2) 압축 클래스 tcompressionStream : 기본 클래스의 onprogress 속성을 상속하는 것 외에도 다른 속성이 추가됩니다. 압축 레이트는 다음과 같이 정의됩니다.
PropertyCompressionRate : SinglerEadgetCompressionRate;
이 속성을 통해 압축 비율을 얻을 수 있습니다.
몇 가지 중요한 방법은 다음과 같이 정의됩니다.
ConstructortOrcompressionStream.create (compressionLevel : tcompressionLevel; dest : tstream);
그 중에서 : tcompressionlevel (압축 유형)은 다음과 같이 정의됩니다.
1) clnone : 데이터 압축은 수행되지 않습니다.
2) clfastest : 압축 효율을 희생하여 빠른 압축을 수행합니다.
3) cldefault : 정상 압축을 수행합니다.
4) CLMAX : 압축 및 희생 속도를 극대화합니다.
DEST : 압축 데이터를 저장하는 데 사용되는 목적지 스트림.
functiontCompressionStream.write (constbuffer; count : longint) : longint;
그중 : 버퍼 : 압축 해야하는 데이터;
카운트 : 압축 할 데이터의 바이트 수;
함수는 스트림에 기록 된 바이트 수를 반환합니다.
참고 : 압축 클래스 tcompressionStream의 데이터는 내부에서 데이터를 읽으려고하면 "오류"예외가 발생합니다. 압축 해야하는 데이터는 메소드 쓰기 방법을 통해 스트림에 기록되며 쓰기 프로세스 중에 압축되며 생성자가 제공 한 메모리 스트림 (tmemorystream)에 저장되며 온 프로세스 이벤트가 트리거됩니다.
3) 감압 클래스 TDECOMPRESSIONSTREAM : 압축 클래스 TCompressionStream과 달리 데이터를 읽으려면 "오류"예외가 발생할 수 있습니다.
몇 가지 중요한 방법은 다음과 같이 정의됩니다.
ConstructorCreate (출처 : TSTREAM);
그중 : 소스는 압축 데이터를 저장하는 스트림입니다.
functionread (varbuffer; count : longint) : longint;
데이터 판독 함수, 버퍼 : 저장 데이터 버퍼;
함수는 읽기 바이트 수를 반환합니다. 읽기 과정에서 데이터가 압축 압축되고 온 프로세스 이벤트가 트리거됩니다.
(ii)
델파이에서 모든 스트림 객체의 기본 클래스는 TSTREAM 클래스로 모든 스트림의 공통 속성과 방법을 정의합니다.
TSTREAM 클래스에 정의 된 속성은 다음과 같습니다.
1), 크기 :이 속성은 스트림의 데이터 크기를 바이트로 반환합니다.
2) 위치 :이 속성은 흐름에서 포인터에 액세스하는 위치를 제어합니다.
TSTREAM에 정의 된 4 가지 가상 방법이 있습니다.
1) 읽기 :이 방법은 스트림에서 데이터를 읽는 것을 구현하며, 반환 값은 실제 바이트 수치이며 지정된 값보다 작거나 동일 할 수 있습니다.
2) 쓰기 :이 방법은 스트림에 데이터를 쓰는 것을 구현하고 반환 값은 실제로 스트림에 작성된 바이트 수입니다.
3) Seek :이 방법은 스트림에서 읽기 포인터의 움직임을 깨닫고 반환 값은 움직임 후 포인터의 위치입니다.
함수 프로토 타입은 다음과 같습니다. functionseek (오프셋 : longint; origint : word) : longint; 가상; 초록;
파라미터 오프셋은 오프셋 바이트의 수입니다.
sofrombeginning : 오프셋은 포인터 거리 데이터가 시작됩니다. 현재 오프셋은 0보다 크거나 같아야합니다.
Sofromcurrent : 오프셋은 이동 후 포인터와 현재 포인터의 상대 위치입니다.
Sofromend : 오프셋은 이동 후 포인터 거리 데이터가 끝나는 위치입니다. 현재 오프셋은 0보다 작거나 동일해야합니다.
4) setSize :이 방법은 데이터의 크기를 변경한다는 것을 인식합니다.
또한 몇 가지 정적 방법은 TSTREAM 클래스에서 정의됩니다.
1) ReadBuffer :이 방법의 기능은 위의 읽기와 동일한 스트림의 현재 위치에서 데이터를 읽는 것입니다.
참고 : 읽기 읽기 수가 읽을 바이트 수와 다를 때 EREADERROR 예외가 생성됩니다.
2) WriteBuffer :이 방법의 기능은 위의 쓰기와 동일한 현재 위치에서 스트림에 데이터를 작성하는 것입니다.
참고 : 데이터에 작성된 바이트 수가 작성할 바이트 수와 다르면 ewriteError 예외가 생성됩니다.
3) COPYFROM :이 방법의 기능은 다른 스트림에서 데이터 스트림을 복사하는 것입니다.
기능 프로토 타입은 다음과 같습니다. functionCopyFrom (출처 : tstream; count : longint) : longint;
매개 변수 소스는 데이터를 제공하는 스트림이며 카운트는 복사 된 데이터 바이트 수입니다. COUNT가 0보다 클 때 카피는 소스 매개 변수의 현재 위치에서 데이터의 바이트 카운트 카운트 카운트 카운트가 소스 매개 변수의 위치 속성을 0으로 설정 한 다음 소스에서 모든 데이터를 복사합니다.
일반적으로 파생 된 클래스의 TSTREAM :
tfilestream (파일 스트림 액세스)
TStringstream (메모리의 프로세스 문자열 유형 데이터)
tmemorystream (작업 메모리 영역 데이터 처리 용)
tblobstream (Blob 유형 필드의 데이터 처리)
TwinsocketStream (소켓의 읽기 및 쓰기)
Tolestream (COM 인터페이스의 데이터 처리)
tresourcestream (리소스 파일 스트림 처리)
가장 일반적으로 사용되는 것은 tfilestream 클래스입니다. tfilestream 클래스를 사용하여 파일에 액세스하려면 먼저 인스턴스를 작성해야합니다. 진술은 다음과 같습니다.
constructorcreate (constfilename : 문자열; 모드 : Word);
파일 이름은 파일 이름 (경로 포함)입니다.
모드는 파일을 열 수있는 방법입니다.
오픈 모드 :
fmcreate : 지정된 파일 이름으로 파일을 만들고 파일이 이미 존재하면 열 수 있습니다.
fmopenread : 지정된 파일을 읽기 전용으로 엽니 다
fmopenwrite : 지정된 파일을 쓰기 전용 방식으로 엽니 다
fmopenreadwrite : 서면 모드에서 지정된 파일을 엽니 다
공유 모드 :
FMSHARECOMPAT : 공유 모드는 FCB와 호환됩니다
FMSHAREEXCLUSION : 다른 프로그램은 어떤 식 으로든 파일을 열 수 없습니다.
fmsharedenywrite : 다른 프로그램이 서면으로 파일을 열 수 없습니다.
FMSHAREDENYREAD : 다른 프로그램이 읽기 모드에서 파일을 열 수 없습니다.
fmsharedenynone : 다른 프로그램은 어떤 식 으로든 파일을 열 수 있습니다.
(iii) 리소스 파일
1) 리소스 파일을 만듭니다
먼저 .rc의 일반 텍스트 파일을 만듭니다.
형식 : 리소스 식별자 키워드 리소스 파일 이름
리소스 식별자 : 프로그램에서 리소스를 호출 할 때 특별 레이블;
키워드 : 리소스 파일 유형을 식별합니다.
Wave : 리소스 파일은 사운드 파일입니다.
RCDATA : JPEG 파일;
AVI : AVI 애니메이션;
아이콘 : 아이콘 파일;
비트 맵 : 비트 맵 파일;
커서 : 커서 파일;
외계 : exe 파일
리소스 파일 이름 : 리소스 파일 디스크에 저장된 파일의 전체 이름
예를 들어:
myzjyexefilezjy.exe
2) 리소스 파일을 컴파일합니다
Delphi 설치 디렉토리의 /bin에서 Brcc32.exe를 사용하여 리소스 파일을 컴파일합니다. 물론 사용하기 위해 BRCC32를 프로그램 문서 디렉토리에 별도로 복사 할 수도 있습니다.
예를 들어:
BRCC32WNHOO_REG.RC
3) 리소스 파일 참조
…
구현
{$ r*.dfm}
{$ rwnhoo_reg.res}
…
4) 리소스 파일을 호출하십시오
(1) 리소스 파일 (Bitmap)의 비트 맵에 액세스하십시오.
image.picture.bitmap.handle : = loadbitMap (Hinstance, 'resource 식별자');
참고 : 비트 맵이 성공적으로로드되지 않으면 프로그램이 여전히 실행되지만 이미지는 더 이상 표시되지 않습니다. LoadBitMap 함수의 반환 값에 따라 부하가 성공했는지 판단 할 수 있습니다.
비트 맵에 액세스하고 표시하는 또 다른 방법은 다음과 같습니다.
image.picture.bitmap.loadfromresourceName (Hinstance, 'resource identifier');
(2) 리소스 파일의 커서에 액세스하십시오
screen.cursors []는 커서 파일을 사용 하여이 속성에 맞춤형 커서를 추가 할 수 있습니다. 배열의 기본 커서 인덱스 값은 0이므로 기본 커서를 교체하지 않는 한 사용자 정의 커서 인덱스 값을 1로 설정하는 것이 가장 좋습니다.
screen.cursors [1] : = loadCursor (Hinstance, 'Resource Identifier');
image.cursor : = 1;
(3) 리소스 파일의 아이콘에 액세스합니다
리소스 파일에 아이콘을 넣으면 응용 프로그램 아이콘을 동적으로 변경할 수 있습니다.
application.icon.handle : = loadicon (Hinstance, 'Resource Identifier');
(4) 리소스 파일의 AVI에 액세스하십시오
animate.resname : = 'myavi'; // 리소스 식별자 번호
ANIMET.ACTIVE : = true;
(5) 리소스 파일에서 JPEG에 액세스하십시오
JPEG 장치를 사용 장치에 추가하십시오.
var
fjpg : tjpegimage;
fstream : tresourcestream;
시작하다
fjpg : = tjpegimage.create;
// tresourcestream 사용
fstream : = tresourcestream.create (Hinstance, '자원 식별자', 자원 유형);
fjpg.loadFromStream (fstream);
image.picture.bitmap.assign (fjpg);
(6) 리소스 파일의 액세스 파
사용 장치에 mmsystem을 추가하십시오
연극 (pchar ( 'mywav'), Hinstance, snd_asyncorsnd_memoryorsnd_resource);
(iv) INI 파일 작동
(1) INI 파일의 구조 :
; 이것은 INI 파일에 대한 주석 섹션입니다
[마디]
키워드 = 값
...
INI 파일은 여러 노드를 허용하고 각 노드는 "="다음으로 키워드의 값을 허용합니다 (문자열, 정수 값 및 부울 값은 세 가지 유형이 있습니다. INI 파일, 진정한 부울 값은 1으로 표시되고, 잘못된 부울 값은 0)로 표시됩니다. 댓글은 세미콜론으로 시작합니다 ";".
(2) INI 파일 작동
1. 인터페이스의 사용 섹션에 불일치를 추가하십시오.
2. var 변수 정의 부분에 줄을 추가하십시오 : Inifile : Tinifile;
3. INI 파일을 엽니 다 : inifile : = tinifile.create ( 'tmp.ini');
4. 키워드의 값을 읽으십시오.
A : = inifile.ReadString ( '노드', '키워드', 기본값);
b : = inifile.readinteger ( '노드', '키워드', 기본값); // 정수 유형
C : = inifile.readbool ( '노드', '키워드', 기본값);
여기서 [기본값]은 키워드가 INI 파일에 존재하지 않을 때 반환 된 기본값입니다.
5. INI 파일에 쓰기 :
inifile.writestring ( '노드', '키워드', 변수 또는 문자열 값);
inifile.writeInteger ( '노드', '키워드', 가변 또는 정수 값);
inifile.writebool ( '노드', '키워드', 변수 또는 참 또는 거짓);
이 INI 파일의 노드가 존재하지 않으면 위의 명령문은 자동으로 INI 파일을 작성합니다.
6. 키워드 삭제 :
inifile.deletekey ( '노드', '키워드'); // 키워드 삭제
inifile.erasesection ( '노드'); // 노드 제거
7. 노드 작동 :
inifile.readsection ( '노드', tstrings 변수); // 지정된 섹션의 모든 키워드 이름은 문자열 목록 변수로 읽을 수 있습니다.
inifile.readsections (tstrings ariable); // INI 파일의 모든 하위 섹션 이름을 문자열 목록 변수로 읽을 수 있습니다.
inifile.readsectionValues ( 'Node', TStrings 변수); // INI 파일의 지정된 섹션의 모든 줄 (키워드, =, 값 포함)은 문자열 목록 변수로 읽을 수 있습니다.
8. 릴리스 : inifile.distory 또는 Inifile.
(v) 문서 관계
용도
레지스트리, Shlobj;
// 관련 등록을 실현합니다
ProcessETMYZIP.regzzz;
var
Reg : Tregistry;
시작하다
Reg : = tregistry.create;
reg.rootkey : = hkey_classes_root;
reg.openkey ( '. zzz', true);
reg.writestring ( '', 'myzip');
reg.closekey;
reg.openkey ( 'myzip/shell/open/command', true);
// .zzz 파일을 열는 데 사용되는 실행 프로그램
Reg.Writestring ( '', ' "'+application.exename+'" "%1"');
reg.closekey;
reg.openkey ( 'myzip/defaulticon', true);
// .zzz 파일의 아이콘으로 현재 실행 가능한 프로그램의 아이콘을 제발
Reg.Writestring ( '', ''+application.exename+', 0');
Reg.free;
// 지금 새로 고침
shchangenotify (shcne_assocchanged, shcnf_idlist, nil, nil);
끝;
2.3
1. INI 임시 암호화 파일을 생성합니다
암호화를위한 INI의 임시 파일 형식 :
[file1] // 노드, 멀티 파일 암호화를 소프트웨어에서 File1..N을 사용하여 달성 할 수 있습니다.
filename = 압축 파일 이름
비밀번호 = 감압 비밀번호
파일 크기 = 파일 크기
filedate = 날짜 생성
ISJM = 압축 압축이 필요합니까?
여러 파일 및 폴더의 정보 저장소를 구현하면 비밀번호 키워드를 총 노드 아래에 저장할 수 있습니다. 이 기사는 위 형식이 충분한 한 단일 파일의 암호화만을 구현합니다.
2. 파일 스트림 형식으로 구현할 수있는 암호화에 사용 된 INI 파일과 데이터 파일을 병합하십시오.
암호화 된 파일 구조 다이어그램 :
그림 (1)
그림 (2)
위의 두 가지 형태는 실제 조건에 따라 사용할 수 있습니다. 이 기사는 그림 (1)의 구조를 채택합니다.
3. 암호화 된 데이터의 경우 Zlib 기술은 압축 스토리지를 실현하고 새로운 압축 파일을 생성하는 데 사용됩니다.
2.4. 파일 연관의 구현은 2.2 참조
2.5
1. 감압에서 특별히 실행 프로그램 파일을 만듭니다
2. 1에서 리소스 파일을 만듭니다
3. 이 기사에서 자원 파일을이 압축 도구의 프로그램에 넣고 함께 컴파일하십시오.
4. 자체 추출 파일을 압축 파일과 병합하여 자체 추출 파일을 생성합니다.
자체 추출 파일 구조 다이어그램 :
5. 자체 탈퇴 구현 : 자체 파일에서 암호화 된 압축 데이터를 분해 한 다음 분해 된 암호화 된 압축 데이터를 다시 압축하고 실제 데이터 파일을 분해합니다.
2.6 시스템 프로그래밍
이것은이 소프트웨어 구현의 핵심 부분의 모든 코드이며, 여기서는이 소프트웨어의 모든 기술적 세부 사항을 자세히 설명합니다.
//wnhoo_zzz.pas
unitwnhoo_zzz;
인터페이스
용도
창, 형태, sysutils, 클래스, zlib, 레지스트리, infiles, 대화, shlobj;
유형
Pass = String [20];
유형
tmyzip = 클래스
사적인
{privatedeClarationshere}
보호
{ProtectedDeclarationshere}
공공의
Procedureregzzz;
process_file (InfileName, Outfilename : String; Password : Pass; ISJM : Boolean; YSBZ : Integer);
functionjy_file (infilename : 문자열; 비밀번호 : pass = '') : 부울;
processurezjywj (varfilename : string);
생성자 생성;
Destructordestroy; 재정의;
{publicdeclarationshere}
게시
{publishedDeclarationshere}
끝;
구현
constructortmyzip.create;
시작하다
상속 된 크리징; // 상속 된 부분을 초기화합니다
끝;
// ##################################################################################################YOUMYD #################################### ########################################################################. #################################### ########################################################################. #################################### ########################################################################. #################################### ########################################################################. ##### #####
// 원본 파일 암호화
Processurejm_file (vfile : String; Vartarget : tmemorystream; password : pass; isjm : boolean);
{
Vfile : 암호화 된 파일
대상 : 암호화 후 출력 대상 스트림 》》》》》
비밀번호 : 비밀번호
ISJM : 암호화 되었습니까?
--------------------------------------------------------- --------------------------------------------------------- ---------------------------------------------
암호화 된 파일 크기 = 원본 파일 크기 + [INI 암호화 압축 정보 파일] 크기 + 크기 크기 저장 [INI 암호화 압축 정보 파일]
--------------------------------------------------------- --------------------------------------------------------- ---------------------------------------------------
}
var
TMPSTREAM, Instream : Tfilestream;
파일 크기 : 정수;
inifile : Tinifile;
파일 이름 : 문자열;
시작하다
// 개방이 필요합니다 [암호화 된 압축 파일]
tmpStream : = tfilestream.create (vfile, fmopenreadorfmshareexclusive);
노력하다
// [원본 파일 스트림]을 [임시 암호화 압축 된 파일 스트림] 끝까지 씁니다.
target.seek (0, sofromend);
target.copyfrom (tmpstream, 0);
// 파일 경로를 가져 와서 생성 [INI 암호화 압축 정보 파일]
filename : = ExtractFilePath (paramstr (0))+'tmp.in_';
inifile : = tinifile.create (filename);
inifile.writestring ( 'file1', 'filename', extractfilename (vfile));
inifile.writestring ( 'file1', 'password', password);
inifile.writeInteger ( 'file1', 'filesize', target.size);
inifile.writedateTime ( 'file1', 'filedate', now ());
inifile.writebool ( 'file1', 'isjm', isjm);
inifile.free;
// [INI 암호화 압축 정보 파일 스트림에서 읽기]에서 읽습니다.
instream : = tfilestream.create (filename, fmopenreadorfmshareexclusive);
노력하다
// [INI 암호화 압축 정보 파일] [INI 암호화 압축 파일 스트림]의 끝에 계속 추가하십시오.
instream.position : = 0;
target.seek (0, sofromend);
target.copyfrom (Inistream, 0);
// 현재 크기를 계산합니다 [INI 암호화 압축 정보 파일]
파일 크기 : = inistream.size;
// [임시 암호화 파일] 끝에서 [INI 암호화 압축 정보 파일]의 크기 정보를 계속 추가하십시오.
target.writeBuffer (Filesize, sizeof (filesize));
마지막으로
instream.free;
deletefile (filename);
끝;
마지막으로
tmpstream.free;
끝;
끝;
// ******************************************* ***************************************************************************************** 누군가 ***************************************************************************************** 누군가 ***************************************************************************************** 누군가 ***************************************************************************************** 누군가 ***************************************************************************************** 누군가 ***************************************************************************************** 누군가 ******************************* ***************
// 흐름 압축
process_stream (Instream, Outstream : tstream; ysbz : integer);
{
Instream : 압축 할 암호화 된 파일 스트림
아웃 스트림 압축 출력 파일 스트림
YSBZ : 압축 표준
}
var
YS : tcompressionStream;
시작하다
// 흐름 포인터가 머리를 가리 킵니다
instream.position : = 0;
// 압축 표준을 선택합니다
casesBzof
1 : ys : = tcompressionStream.create (clnone, averstream); // 압축되지 않습니다
2 : ys : = tcompressionStream.create (clfastest, averstream); // 빠른 압축
3 : ys : = tcompressionstream.create (cldefault, etstream); // 표준 압축
4 : ys : = tcompressionstream.create (clmax, etstream); // 최대 압축
또 다른
ys : = tcompressionStream.create (clfastest, averstream);
끝;
노력하다
// 압축 스트림
ys.copyfrom (Instream, 0);
마지막으로
ys.free;
끝;
끝;
// ******************************************* ***************************************************************************************** 누군가 ***************************************************************************************** 누군가 ***************************************************************************************** 누군가 ***************************************************************************************** 누군가 ***************************************************************************************** 누군가 ***************************************************************************************** 누군가 *************************************************
// 흐름 감압
ProcedureJy_Stream (Instream, Outstream : TStream);
{
Instream : 원래 압축 스트림 파일
아웃스트림 : 스트리밍 파일을 압축 해제하십시오
}
var
Jyl : tdecompressionstream;
BUF : 배열 [1..512] ofbyte;
sjread : 정수;
시작하다
instream.position : = 0;
jyl : = tdecompressionstream.create (Instream);
노력하다
반복하다
// 실제 크기를 읽습니다
sjread : = jyl.read (buf, sizeof (buf));
ifsjread> 0then
outstream.write (buf, sjread);
(sjread = 0)까지;
마지막으로
jyl.free;
끝;
끝;
// ******************************************* ***************************************************************************************** 누군가 ***************************************************************************************** 누군가 ***************************************************************************************** 누군가 ***************************************************************************************** 누군가 ***************************************************************************************** 누군가 ***************************************************************************************** 누군가 ******************************* ***************
// 관련 등록을 실현합니다
ProcessETMYZIP.regzzz;
var
Reg : Tregistry;
시작하다
Reg : = tregistry.create;
reg.rootkey : = hkey_classes_root;
reg.openkey ( '. zzz', true);
reg.writestring ( '', 'myzip');
reg.closekey;
reg.openkey ( 'myzip/shell/open/command', true);
// .zzz 파일을 열는 데 사용되는 실행 프로그램
Reg.Writestring ( '', ' "'+application.exename+'" "%1"');
reg.closekey;
reg.openkey ( 'myzip/defaulticon', true);
// .zzz 파일의 아이콘으로 현재 실행 가능한 프로그램의 아이콘을 제발
Reg.Writestring ( '', ''+application.exename+', 0');
Reg.free;
// 지금 새로 고침
shchangenotify (shcne_assocchanged, shcnf_idlist, nil, nil);
끝;
// 파일을 압축합니다
ProcessEtmyZip.ys_file (Infilename, Outfilename : String; password : pass; isjm : boolean; ysbz : integer);
{
Infilename : // 암호화 된 파일을 압축해야합니다
Outfilename : // 암호화 후 생성 된 파일을 압축합니다
비밀번호 : // 압축 압축 비밀번호
ysbz : // 압축 표준
}
var
Instream : tmemorystream; // 파일 암호화 후 임시 스트림
아웃 스트림 : tfilestream; // 출력 파일 스트림을 압축합니다
시작하다
// [파일 암호화 후 임시 스트림] 생성
Instream : = tmemorystream.create;
// 파일 암호화
JM_FILE (InfileName, Instream, Password, ISJM);
// 압축 된 출력 파일 스트림을 만듭니다
아웃 스트림 : = tfilestream.create (Outfilename, fmcreate);
노력하다
// [파일 암호화 후 임시 스트림] 압축
ys_stream (Instream, Outstream, YSBZ);
마지막으로
외부.
Enterstream.free;
끝;
끝;
// 파일을 압축합니다
functiontmyzip.jy_file (Infilename : String; password : pass = '') : boolean;
var
Instream, Instream, Filestream_ok : tfilestream;
{
instream : // zip 파일 이름
Instream : // INI 임시 파일 스트림
FILESTREAM_OK : // OK 파일을 압축 해제합니다
}
아웃 스트림 : tmemorystream; // 임시 메모리 스트림
inifile : tinifile; // 임시 INI 파일
파일 크기 : 정수; // 비밀번호 파일의 크기
resultValue : 부울; // 반환 값
시작하다
노력하다
instream : = tfilestream.create (infilename, fmopenread);
노력하다
아웃 스트림 : = tmemorystream.create;
노력하다
jy_stream (Instream, Outstream);
// 임시 INI 파일을 생성합니다
instream : = tfilestream.create (ExtractFilePath (paramstr (0))+'tmp.in _', fmcreate);
노력하다
// 디코딩 된 정보를 저장하는 정수 유형 변수 위치를 가리 킵니다.
Outstream.seek (-sizeof (filesize), sofromend);
// 변수 정보를 읽습니다
Outstream.ReadBuffer (Filesize, sizeof (filesize));
// 디코딩 된 정보 위치를 가리 킵니다
Outstream.seek (-(파일 크기+sizeof (filesize)), sofromend);
// 디코딩 된 정보를 INI 스트림에 읽습니다
instream.copyfrom (아웃 스트림, 파일 크기);
// INI 파일 스트림을 릴리스합니다
instream.free;
// INI 파일 정보를 읽습니다
inifile : = tinifile.create (ExtractFilePath (paramstr (0))+'tmp.in_');
resultValue : = inifile.readbool ( 'file1', 'isjm', false);
ifresultvaluethen
시작하다
ifinifile.readstring ( 'file1', 'password', ') = trim (password)
resultValue : = true
또 다른
resultValue : = false;
끝
또 다른
resultValue : = true;
ifresultvaluethen
시작하다
filestream_ok : = tfilestream.create (extractfilepath (paramstr (1))+inifile.readstring ( 'file1', 'filename', 'wnhoo.zzz'), fmcreate);
노력하다
Outstream.Position : = 0;
filestream_ok.copyfrom (아웃 스트림, inifile.readinteger ( 'file1', 'filesize', 0));
마지막으로
filestream_ok.free;
끝;
끝;
inifile.free;
마지막으로
// 임시 INI 파일을 삭제합니다
deletefile (extractfilepath (paramstr (0))+'tmp.in_');
끝;
//
마지막으로
외부.
끝;
마지막으로
instream.free;
끝;
제외하고
resultValue : = false;
끝;
결과 : = resultValue;
끝;
// 자체 추출 생성
ProcessEetMyZip.zjywj (varfilename : String);
var
Myres : Trsourcestream; // 일시적으로 자체 추출 Exe 파일을 저장합니다
myFile : tfilestream; // 원본 파일 스트림
XFILENAME : String; // 임시 파일 이름
file_ok : tmemorystream; // 생성 된 파일의 메모리 스트림
파일 크기 : 정수; // 원본 파일 크기
시작하다
iffilexists (filename)
시작하다
// 메모리 스트림을 만듭니다
file_ok : = tmemorystream.create;
// resource 파일을 릴리스-EXE 파일을 추출합니다
Myres : = Tresourcestream.create (Hinstance, 'myzjy', pchar ( 'Exefile'));
// 원본 파일을 메모리로 읽습니다
myFile : = tfilestream.create (filename, fmopenread);
노력하다
Myres. 위치 : = 0;
file_ok.copyfrom (Myres, 0);
file_ok.seek (0, sofromend);
myFile.Position : = 0;
file_ok.copyfrom (myfile, 0);
file_ok.seek (0, sofromend);
파일 크기 : = myfile.size;
file_ok.writeBuffer (filesize, sizeof (filesize));
file_ok.position : = 0;
xfilename : = ChangeFileExt (filename, '. exe');
file_ok.savetofile (xfilename);
마지막으로
myfile.free;
Myres.free;
file_ok.free;
끝;
deletefile (filename);
filename : = xfilename;
끝;
끝;
// ##################################################################################################YOUMYD #################################### ########################################################################. #################################### ########################################################################. #################################### ########################################################################. #################################### ########################################################################. ##### #####
Destructortmyzip.destroy;
시작하다
상속 대상;
끝;
끝.
3. 결론
Delphi의 새로운 시각적 프로그래밍 환경은 편리하고 빠른 Windows 애플리케이션 개발 도구를 제공합니다. 프로그램 개발자의 경우 Delphi를 사용하여 응용 프로그램 소프트웨어를 개발하면 프로그래밍 효율성이 크게 향상됩니다. Delphi에서는 스트림을 사용하여 파일 처리, 동적 메모리 처리, 네트워크 데이터 처리 등과 같은 다양한 데이터 양식을 쉽게 구현할 수 있으며 작성 프로그램은 효율성을 크게 향상시킬 수 있습니다.
참조 :
1. 델파이 시스템 도움
2. Feng Zhiqiang
3. Chen Jingtao