Delphiを使用して、ファイル暗号化と圧縮を実装します
著者:e mengyuan(wnhoo)
愛と愛
クリックして、この詳細な説明ファイルをダウンロードします
概要:
このドキュメントでは、単一のファイルのデータ暗号化、データの圧縮、自己決定の実装について説明します。同様に、複数のファイルまたはフォルダーの圧縮は、わずかな変更で実現できます。
キーワード:暗号化された圧縮、ZLIB、ストリーム、リソースファイル
導入:
日常生活では、WinzipやWinrarなどの有名な圧縮ソフトウェアを使用していたに違いありません。つまり、ソフトウェア開発プロセス中のデータ暗号化やデータ圧縮などの問題に必然的に遭遇します。この記事では、この技術的な問題について説明します。また、すべてのネチズンが問題に直面し、それを解決したいと思います。この記事では、主にDelphの強力なストリーム処理スキルを使用して、データの暗号化と圧縮を実現し、実際のソフトウェアプログラム開発で使用されます。
1。システム関数
1)データ圧縮
Delphi(TcompressionsStreamおよびTdeCompressionsStream)が提供する2つのストリームクラスを使用して、データの圧縮と減圧を完了します。
2)データ暗号化と圧縮
データ暗号化は、主にtfilestreamとTmemorystreamを使用して、TSTREAMの2つの派生クラスを使用して、1の実装方法を採用する「ストリーム」を使用することで実現されます。
3)圧縮されたファイルをダブルクリックして、自動的に関連付けて解凍します
レジストリ拡張の関連性をプログラムファイルと変更することにより、Tregistryが主に使用されます。
4)自己抽出ファイルを生成できます
自己決定ファイルは、データ圧縮の自動減圧1)およびデータ暗号化圧縮2);データの自己決定が達成されます。
2。システムの実装
2.1作業原則
2.2キーテクノロジーの説明
(i)zlib
1)ベースクラスTCUSTOMZLIBSTREAM:TCOMPRESSIONSTREAMおよびTDECOMPRESSIONSSTREAMクラスは、主にプロパスを備えています。
フォーマット:procretureonprogress(sender:tobject); dynamic;
2)圧縮クラスのtcompressionsStream:基本クラスのプログレスプロパティを継承することに加えて、別の属性が追加されます:圧縮されます。これは次のように定義されます。
PropertycompressionRate:SinglerEadGetCompressionRate;
このプロパティを通じて、圧縮率を取得できます。
いくつかの重要な方法は次のように定義されています。
ConstructortOrtCompressionsTream.Create(CompressionLevel:TCompressionLevel; Dest:TSTREAM);
その中には、tcompressionLevel(圧縮タイプ)、次のように定義されています。
1)clnone:データ圧縮は実行されません。
2)Clfastest:迅速な圧縮を実行し、圧縮効率を犠牲にします。
3)Cldefault:通常の圧縮を実行します。
4)CLMAX:圧縮と犠牲の速度を最大化します。
DEST:圧縮データの保存に使用される宛先ストリーム。
functiontcompressionstream.write(constbuffer; count:longint):longint;
その中には、バッファ:圧縮する必要があるデータ。
カウント:圧縮されるデータのバイト数。
この関数は、ストリームに書き込まれたバイト数を返します。
注:圧縮されたクラスTCOMPRESSIONSTREAMのデータは、内部からデータを読み取ろうとする場合にのみ作成できます。圧縮する必要があるデータは、メソッド書き込みメソッドを介してストリームに書き込まれ、書き込みプロセス中に圧縮され、コンストラクターが提供するメモリストリーム(Tmemorystream)に保存され、OnProcessイベントがトリガーされます。
3)減圧クラスtdecompressionsストリーム:圧縮クラスのtcompressionsストリームとは対照的に、そのデータを読み取ると、「エラー」の例外が発生します。
そのいくつかの重要な方法は、次のように定義されています。
constructorcreate(出典:TSTREAM);
その中には、ソースには圧縮データを保存するストリームがあります。
functionread(varbuffer; count:longint):longint;
データの読み取り関数、バッファ:データバッファーを格納:バッファのサイズ。
関数は、読み取りバイトの数を返します。読み取りプロセス中、データは減圧され、OnProcessイベントがトリガーされます。
(ii)
Delphiでは、すべてのストリームオブジェクトの基本クラスはTSTREAMクラスで、すべてのストリームの共通のプロパティと方法を定義します。
TStreamクラスで定義されているプロパティは次のとおりです。
1)、サイズ:このプロパティは、バイトのストリーム内のデータサイズを返します。
2)位置:このプロパティは、フロー内のポインターにアクセスする位置を制御します。
TSTREAMで定義されている4つの仮想メソッドがあります。
1)読み取り:この方法では、ストリームからの読み取りデータを実装します。また、返品値は、指定された値以下の読み取り値の実際のバイト数です。
2)書き込み:この方法では、記述データをストリームに実装し、返品値は実際にストリームに書き込まれたバイト数です。
3)シーク:この方法は、ストリーム内の読み取りポインターの動きを実現し、戻り値は動き後のポインターの位置です。
関数プロトタイプは次のとおりです。FunctionSeek(offset:longint; origint:word):longint; virtual; abstract;
パラメーターオフセットは、オフセットバイトの数です。
sofrombegining:オフセットは、ポインター距離データの開始です。現時点では、オフセットはゼロ以上でなければなりません。
sofromcurrent:オフセットは、移動後のポインターの相対的な位置と現在のポインターです。
ソフロメンド:オフセットは、移動後にポインター距離データが終了する位置です。現時点では、オフセットはゼロ以下でなければなりません。
4)セットサイズ:この方法は、データのサイズの変更を実現します。
さらに、TSTREAMクラスでは、いくつかの静的方法が定義されています。
1)ReadBuffer:この方法の機能は、上記の読み取りと同じであるストリーム内の現在の位置からデータを読み取ることです。
注:読み取りバイト数が読み取られるバイト数とは異なる場合、EreAderrorの例外が生成されます。
2)WriteBuffer:この方法の機能は、上記の書き込みと同じである現在の場所のストリームにデータを書き込むことです。
注:データに記載されているバイト数が記述されるバイト数とは異なる場合、eWriteErrorの例外が生成されます。
3)コピーフロム:この方法の機能は、他のストリームからデータストリームをコピーすることです。
関数プロトタイプは次のとおりです。FunctionCopyfrom(Source:TStream; Count:Longint):Longint;
パラメーターソースはデータを提供するストリームであり、カウントはコピーされたデータバイトの数です。カウントが0を超える場合、コピーのコピーはソースパラメーターの現在の位置からのデータのバイトをカウントします。
一般的に派生したTSTREAMのクラス:
tfilestream(ファイルストリームへのアクセス)
TStringStream(メモリ内の文字列タイプデータをプロセス)
tmemorystream(ワーキングメモリエリアデータ処理用)
tblobstream(BLOBタイプフィールドのデータ処理)
TwinsocketStream(ソケットの読み取りと書き込み処理)
toleStream(comインターフェイスのデータ処理)
TRESOURCESTREAM(リソースファイルストリームの処理)
最も一般的に使用されるものは、tfilestreamクラスです。 TFILESTREAMクラスを使用してファイルにアクセスするには、最初にインスタンスを作成する必要があります。声明は次のとおりです。
constructorcreate(constfilename:string; mode:word);
ファイル名はファイル名(パスを含む)です
モードは、ファイルのオープニングモードと共有モードを開く方法です。
オープンモード:
fmcreate:指定されたファイル名でファイルを作成し、ファイルが既に存在する場合は開きます。
fmopenread:指定されたファイルを読み取り専用に開きます
fmopenwrite:指定されたファイルを書き込みのみの方法で開きます
fmopenreadwrite:指定されたファイルを書き込みモードで開きます
共有モード:
FMShareCompat:共有モードはFCBと互換性があります
fmshareexclusive:他のプログラムは何らかの方法でファイルを開くことは許可されていません
fmsharedenywrite:他のプログラムは書面でファイルを開くことは許可されていません
fmsharedenyread:読み取りモードでファイルを開くことは許可されていません
fmsharedenynone:他のプログラムは何でもファイルを開くことができます
(iii)リソースファイル
1)リソースファイルを作成します
最初に.rcのプレーンテキストファイルを作成します。
フォーマット:リソース識別子キーワードリソースファイル名
リソース識別子:プログラムのリソースを呼び出すときの特別なラベル。
キーワード:リソースファイルタイプを識別します。
Wave:リソースファイルはサウンドファイルです。
rcdata:jpegファイル。
AVI:AVIアニメーション;
アイコン:アイコンファイル。
ビットマップ:ビットマップファイル。
カーソル:カーソルファイル。
exefile:exeファイル
リソースファイル名:リソースファイルのディスクに保存されているファイルのフルネーム
例えば:
myzjyexefilezjy.exe
2)リソースファイルをコンパイルします
Delphiインストールディレクトリの下 /ビン、brcc32.exeを使用してリソースfile.rcをコンパイルします。もちろん、BRCC32をプログラムドキュメントディレクトリに個別にコピーするためにコピーすることもできます。
例えば:
brcc32wnhoo_reg.rc
3)リソースファイル参照
…
実装
{$ r*.dfm}
{$ rwnhoo_reg.res}
…
4)リソースファイルを呼び出します
(1)リソースファイルのビットマップにアクセスする(ビットマップ)
image.picture.bitmap.handle:= loadbitmap(hinstance、 'resource識別子');
注:ビットマップが正常にロードされていない場合でも、プログラムは実行されますが、画像は表示されなくなります。 LoadbitMap関数の返品値に基づいて負荷が成功するかどうかを判断できます。
ビットマップにアクセスして表示する別の方法は次のとおりです
image.picture.bitmap.loadfromresourcename(hinstance、 'resource識別子');
(2)リソースファイルのカーソルにアクセスします
screen.cursors []は、カーソルファイルを使用して、このプロパティにカスタマイズされたカーソルを追加できます。配列のデフォルトのカーソルインデックス値は0であるため、デフォルトのカーソルを交換しない限り、カスタマイズされたカーソルインデックス値を1に設定することをお勧めします。
screen.cursors [1]:= loadcursor(hinstance、 'resource識別子');
image.cursor:= 1;
(3)リソースファイルのアクセスアイコン
アイコンをリソースファイルに配置すると、アプリケーションアイコンを動的に変更できます。
application.icon.handle:= loadicon(hinstance、 'resource識別子');
(4)リソースファイルにAVIにアクセスします
animate.resname:= 'myavi'; //リソース識別子番号
animate.active:= true;
(5)リソースファイルにJPEGにアクセスします
JPEGユニットを使用ユニットに追加します。
var
fjpg:tjpegimage;
fstream:tresourcestream;
始める
fjpg:= tjpegimage.create;
// tresourcestreamの使用
fstream:= tresourcestream.create(hinstance、 'resource識別子'、リソースタイプ);
fjpg.loadfromstream(fstream);
image.picture.bitmap.assign(fjpg);
(6)リソースファイルのアクセスウェーブ
MMSystemを使用ユニットに追加します
playsound(pchar( 'mywav')、hinstance、snd_asyncorsnd_memoryorsnd_resource);
(iv)iniファイル操作
(1)INIファイルの構造:
;これは、INIファイルに関するコメントセクションです
[ノード]
キーワード=値
...
INIファイルは複数のノードを許可し、各ノードは複数のキーワードを許可します。 INIファイル、真のブール値は1で表され、誤ったブール値は0で表されます。コメントはセミコロンで始まります ";"。
(2)INIファイルの操作
1.インターフェイスの使用セクションにInifilesを追加します。
2.変数定義に行を追加:Inifile:Tinifile;
3。iniファイルを開きます:inifile:= tinifile.create( 'tmp.ini');
4.キーワードの値を読む:
a:= inifile.readstring( 'node'、 'keyword'、default値);
b:= inifile.readinteger( 'node'、 'keyword'、default value); // integerタイプ
c:= inifile.readbool( 'node'、 'keyword'、default value);
ここで、[デフォルト]は、INIファイルにキーワードが存在しない場合に返されるデフォルト値です。
5。iniファイルに書き込みます:
inifile.writestring( 'node'、 'keyword'、変数または文字列値);
inifile.writeinteger( 'node'、 'keyword'、variableまたはinteger値);
inifile.writebool( 'node'、 'keyword'、variable or trueまたはfalse);
このINIファイルのノードが存在しない場合、上記のステートメントは自動的にINIファイルを作成します。
6.キーワードの削除:
inifile.deletekey( 'node'、 'keyword'); // keyword delete
Inifile.erasesection( 'node'); //ノード削除
7。ノード操作:
inifile.readsection( 'node'、tstrings variable); //指定されたセクションのすべてのキーワード名は、文字列リスト変数に読み取ることができます。
inifile.readsections(tstrings variable); // iniファイルのすべてのサブセクション名を文字列リスト変数に読み取ることができます。
inifile.readsectionValues( 'node'、tstrings variable); //すべての行(キーワード、=、値を含む)INIファイルの指定されたセクションは、文字列リスト変数に読み取ることができます。
8。リリース:Inifile.Distory;またはInifile.Free;
(v)文書関係
用途
レジストリ、shlobj;
//関連する登録を実現します
proceduretmyzip.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 =圧縮ファイル名
パスワード=減圧パスワード
filesize =ファイルサイズ
filedate =作成日
ISJM =減圧する必要がありますか?
複数のファイルとフォルダーの情報ストレージを実装すると、合計ノードの下にパスワードキーワードを保存できます。この記事では、上記の形式で十分である限り、単一のファイルの暗号化のみを実装します。
2.ファイルストリームの形式で実装できる暗号化に使用されるINIファイルとデータファイルをマージします。
暗号化されたファイル構造図:
図(1)
図(2)
上記の2つのフォームは、実際の条件に応じて使用できます。この記事では、図(1)の構造を採用しています。
3.暗号化されたデータの場合、ZLIBテクノロジーを使用して、圧縮ストレージを実現し、新しい圧縮ファイルを生成します。
2.4ファイルアソシエーションの実装については、2.2(v)を参照してください
2.5自己抑制の実装
1。減圧から特に実行可能なプログラムファイルを作成します
2。 1にリソースファイルを作成します
3。この記事のこの圧縮ツールのプログラムにリソースファイルを入れて、一緒にコンパイルします。
4。リソースファイルを圧縮ファイルとマージして、自己抽出ファイルを生成します。
ファイル構造の自己抽出図:
5。自己圧縮実装:暗号化された圧縮データを独自のファイルに分解し、分解された暗号化された圧縮データを再び解凍し、実際のデータファイルを分解します。
2.6システムプログラミング
これは、このソフトウェア実装のコア部分のすべてのコードであり、ここでこのソフトウェアのすべての技術的詳細を詳細に説明します。
//wnhoo_zzz.pas
unitwnhoo_zzz;
インタフェース
用途
Windows、Forms、sysutils、classes、zlib、registry、inifiles、dialogs、shlobj;
タイプ
pass = string [20];
タイプ
tmyzip = class
プライベート
{privatedeclarationshere}
保護されています
{protectedDeclarationshere}
公共
procedureregzzz;
procedures_file(infilename、outfilename:string; password:pass; isjm:boolean; ysbz:integer);
functionjy_file(infilename:string; password:pass = ''):boolean;
procedurezjywj(varfilename:string);
constructorcreate;
Destructordestroy;オーバーライド;
{publicdeclarationshere}
公開
{公開されたdeclarationshere}
終わり;
実装
constructortmyzip.create;
始める
継承料金; //継承された部分を初期化します
終わり;
// ######################################################### ###################################################################### #################################
//元のファイル暗号化
procedurejm_file(vfile:string; vartarget:tmemorystream; password:pass; isjm:boolean);
{
vfile:暗号化されたファイル
ターゲット:暗号化後の出力ターゲットストリーム》》》》》
パスワード:パスワード
ISJM:暗号化されていますか?
-------------------------------------------------------------- -------------------------------------------------------------- -------------------------------------------------------------- -------------------------------------------------------------- -------------------------------------------------------------- ------ ----------------------
暗号化されたファイルサイズ=元のファイルサイズ + [INI暗号化された圧縮情報ファイル]サイズ +サイズ[INI暗号化された圧縮情報ファイル]のサイズデータ型を保存
-------------------------------------------------------------- -------------------------------------------------------------- -------------------------------------------------------------- -------------------------------------------------------------- -------------------------------------------------------------- ------ -------------------------------
}
var
tmpstream、インストリーム:tfilestream;
filesize:integer;
Inifile:Tinifile;
ファイル名:文字列;
始める
//開くには[暗号化された圧縮ファイル]が必要です
tmpstream:= tfilestream.create(vfile、fmopenreadorfmshareexclusive);
試す
// [オリジナルファイルストリーム]を[一時的な暗号化された圧縮ファイルストリーム]の端まで書き込み
ターゲット.seek(0、sofromend);
Target.CopyFrom(TMPSTREAM、0);
//ファイルパスを取得して[INI暗号化された圧縮情報ファイル]を生成します
ファイル名:= extractfilepath(paramstr(0))+'tmp.in_';
Inifile:= tinifile.create(filename);
inifile.writestring( 'file1'、 'filename'、抽出物(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暗号化された圧縮情報ファイル]を追加し続けます
instream.position:= 0;
ターゲット.seek(0、sofromend);
Target.Copyfrom(Inistream、0);
//現在の[INI暗号化された圧縮情報ファイル]のサイズを計算する
filesize:= inistem.size;
// [一時的な暗号化されたファイル]の最後に[INI暗号化された圧縮情報ファイル]のサイズ情報を追加し続けます
Target.writeBuffer(filesize、sizeof(filesize));
ついに
instream.free;
deletefile(filename);
終わり;
ついに
tmpstream.free;
終わり;
終わり;
// ****************************************** ******************************************** ******************************************** ******************************************** ******************************************** ******************************************** ******************************************** *********************************************
//フロー圧縮
procedures_stream(即興、外流:tstream; ysbz:integer);
{
インストレーム:圧縮されるファイルストリームを暗号化します
アウトストリーム圧縮出力ファイルストリーム
YSBZ:圧縮標準
}
var
ys:tcompressionstream;
始める
//フローポインターは頭を指します
instream.position:= 0;
//圧縮標準の選択
casebzof
1:ys:= tcompressionstream.create(clnone、outstream); //圧縮されていません
2:ys:= tcompressionstream.create(clfastest、outstream); //高速圧縮
3:ys:= tcompressionstream.create(cldefault、outstreem); //標準圧縮
4:ys:= tcompressionstream.create(clmax、outstream); //最大圧縮
それ以外
ys:= tcompressionstream.create(clfastest、outstream);
終わり;
試す
//圧縮ストリーム
ys.copyfrom(instream、0);
ついに
ys.free;
終わり;
終わり;
// ****************************************** ******************************************** ******************************************** ******************************************** ******************************************** ******************************************** ******************************************** ***************************************************
//フロー減圧
procreturejy_stream(即興、外流:tstream);
{
インストール:元の圧縮ストリームファイル
アウトストリーム:ストリーミングファイルを解凍します
}
var
Jyl:tdecompressionstream;
buf:ofbyteの配列[1..512];
sjread:整数;
始める
instream.position:= 0;
jyl:= tdecompressionstream.create(instream);
試す
繰り返す
//実際のサイズを読みます
sjread:= jyl.read(buf、sizeof(buf));
ifsjread> 0then
outstream.write(buf、sjread);
(sjread = 0);
ついに
jyl.free;
終わり;
終わり;
// ****************************************** ******************************************** ******************************************** ******************************************** ******************************************** ******************************************** ******************************************** *********************************************
//関連する登録を実現します
proceduretmyzip.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);
終わり;
//ファイルを圧縮します
proceduretmyzip.ys_file(infilename、outfilename:string; password:pass; isjm:boolean; ysbz:integer);
{
infilename://暗号化されたファイルを圧縮する必要があります
outfileName://暗号化後に生成されたファイルを圧縮します
パスワード://パスワードを非表示にします
ysbz://圧縮標準
}
var
インストレーム:tmemorystream; //ファイル暗号化後の一時的なストリーム
アウトストリーム:tfilestream; //出力ファイルストリームを圧縮します
始める
// [ファイル暗号化後の一時ストリーム]を作成する
インストレーム:= tmemorystream.create;
//ファイル暗号化
jm_file(infilename、instream、password、isjm);
//圧縮出力ファイルストリームを作成します
アウトストリーム:= tfilestream.create(outfilename、fmcreate);
試す
// [ファイル暗号化後の一時的なストリーム]圧縮
YS_STREAM(インストラム、アウトストリーム、YSBZ);
ついに
アウトストリーム。
EnterStream.Free;
終わり;
終わり;
//ファイルを減圧します
functiontmyzip.jy_file(infilename:string; password:pass = ''):boolean;
var
インストレーム、インストラム、fileStream_ok:tfilestream;
{
インストリーム://ファイル名を解凍します
インストリーム:// INI一時的なファイルストリーム
filestream_ok:// okファイルを解凍します
}
アウトストリーム:tmemorystream; //一時的なメモリストリーム
Inifile:Tinifile; //一時的なINIファイル
filesize:integer; //パスワードファイルのサイズ
resultValue:boolean; // return値
始める
試す
インストレーム:= tfilestream.create(infilename、fmopenread);
試す
アウトストリーム:= tmemorystream.create;
試す
jy_stream(楽器、アウトストリーム);
//一時的なINIファイルを生成します
instream:= tfilestream.create(extractfilepath(paramstr(0))+'tmp.in _'、fmcreate);
試す
//デコードされた情報を保存する整数型変数位置を指す
outstream.seek(-sizeof(filesize)、sofromend);
//変数情報を読み取ります
outstream.readbuffer(filesize、sizeof(filesize));
//デコードされた情報場所を指します
outstream.seek( - (filesize+sizeof(filesize))、sofromend);
//デコードされた情報をINIストリームに読み取ります
instream.copyfrom(outstreem、filesize);
// 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)then
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(outstreem、infile.readinteger( 'file1'、 'filesize'、0));
ついに
fileStream_ok.free;
終わり;
終わり;
Inifile.Free;
ついに
//一時的なINIファイルを削除します
DeleteFile(ExtractFilepath(Paramstr(0))+'tmp.in_');
終わり;
//
ついに
アウトストリーム。
終わり;
ついに
instream.free;
終わり;
を除外する
resultValue:= false;
終わり;
結果:= resultValue;
終わり;
//作成の自己抽出
procedureetmyzip.zjywj(varfilename:string);
var
myres:trsourcestream; //自己抽出exeファイルを一時的に保存します
myfile:tfilestream; //元のファイルストリーム
XFILENAME:文字列; //一時ファイル名
file_ok:tmemorystream; //生成されたファイルのメモリストリーム
filesize:integer; //元のファイルサイズ
始める
iffileexists(ファイル名)
始める
//メモリストリームを作成します
file_ok:= tmemorystream.create;
//リソースファイルをリリースします - exeファイルを自己抽出します
myres:= tresourcestream.create(hinstance、 'myzjy'、pchar( 'efefile'));
//元のファイルをメモリに読み取ります
myfile:= tfilestream.create(filename、fmopenread);
試す
myres.position:= 0;
file_ok.copyfrom(myres、0);
file_ok.seek(0、sofromend);
myfile.position:= 0;
file_ok.copyfrom(myfile、0);
file_ok.seek(0、sofromend);
filesize:= 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);
ファイル名:= xfileName;
終わり;
終わり;
// ######################################################### ###################################################################### #################################
Destructortmyzip.destroy;
始める
継承されたdestroy;
終わり;
終わり。
3。結論
Delphiの新しいビジュアルプログラミング環境は、便利で高速なWindowsアプリケーション開発ツールを提供します。プログラム開発者の場合、Delphiを使用してアプリケーションソフトウェアを開発することで、間違いなくプログラミング効率が大幅に向上します。 Delphiでは、ストリームを簡単に使用して、ファイル処理、動的メモリ処理、ネットワークデータ処理などのさまざまなデータフォームを実装できます。
参考文献:
1。Delphiシステムヘルプ
2。Delphiの圧縮流と減圧流の適用
3。ChenJingtao