استخدم Delphi لتنفيذ تشفير الملفات والضغط
المؤلف: E Mengyuan (wnhoo)
البريد: [email protected]
الحب والحب
انقر لتنزيل ملف الوصف التفصيلي هذا
ملخص:
في هذا المستند ، سنتحدث عن تنفيذ تشفير البيانات وضغط البيانات وضغط ذاتي لملف واحد. وبالمثل ، يمكن تحقيق ضغط ملفات أو مجلدات متعددة مع تعديل طفيف.
الكلمات الرئيسية: ضغط مشفر ، zlib ، دفق ، ملفات الموارد
مقدمة:
في الحياة اليومية ، يجب أن نستخدم برامج الضغط الشهيرة مثل Winzip و WinRar ، مما يعني أننا سنواجه حتماً مشاكل مثل تشفير البيانات وضغط البيانات أثناء عملية تطوير البرمجيات! يناقش هذا المقال هذه المشكلة الفنية ، وفضل جميع مستخدمي الإنترنت على مهاراتهم في كل مرة أواجه فيها مشكلة ، وأرغب في حلها ، والمهارات التي عملت بجد لإيجادها بشكل مفاجئ وسيتم حل المشكلة. تستخدم هذه المقالة مهارات معالجة الدفق القوية من Delph لتحقيق تشفير البيانات وضغطها ، وتستخدم في تطوير البرامج الفعلية.
1. وظائف النظام
1) ضغط البيانات
استخدم فئتين للتيار المقدمة من Delphi (TCompressionStream و TdeCompressionStream) لإكمال ضغط البيانات وإزالة الضغط.
2) تشفير البيانات والضغط
يتم تحقيق تشفير البيانات من خلال تطبيق "دفق" في برمجة Delphi ، وذلك بشكل أساسي باستخدام Tfilestream و TmemoryStream ، يعتمد فئتان مشتقتان من Tstream ؛
3) انقر نقرًا مزدوجًا فوق الملف المضغوط لربط وإلغاء الضغط تلقائيًا
من خلال تغيير ارتباط تمديد التسجيل مع ملفات البرنامج ، يتم استخدام Tregistry بشكل أساسي ؛
4) يمكن إنشاء ملفات الاستخلاص الذاتي
يدرك الملف المضغوط ذاتيًا الضغط التلقائي لضغط البيانات 1) وضغط تشفير البيانات 2) ؛ يتحقق ضغط البيانات الذاتي للبيانات.
2. تنفيذ النظام
2.1
2.2.
(ط) زلب
1) TCUSTOMZLEBSTEAM: هل الفئة الأساسية من فئات TDECOPRISTERESS.
التنسيق: الإجراءات (Sender: tobject) ؛ ديناميكية ؛
2) فئة الضغط tcompressionStream: بالإضافة إلى ورث خاصية OnProgress للفئة الأساسية ، تتم إضافة سمة أخرى: CompressionRate ، والتي يتم تعريفها على النحو التالي:
PropertyCompressionRate: SinglereadgetCompressionRate ؛
من خلال هذه الخاصية ، يمكن الحصول على نسبة الضغط.
يتم تعريف العديد من الطرق المهمة على النحو التالي:
constructOrtCompressionStream.create (compressionlevel: tcompressionlevel ؛ dest: tstream) ؛
من بينها: tcompressionlevel (نوع الضغط) ، يتم تعريفه بما يلي:
1) Clnone: لا يتم إجراء ضغط بيانات ؛
2) Clfastest: يؤدي الضغط السريع ، والتضحية بكفاءة الضغط ؛
3) CLDEFAULT: إجراء ضغط طبيعي ؛
4) Clmax: تعظيم الضغط وتضحية سرعة ؛
Dest: Destination Stream ، يستخدم لتخزين البيانات المضغوطة.
functionTcompressionStream.write (constbuffer ؛ count: longint): longint ؛
من بينها: المخزن المؤقت: البيانات التي يجب ضغطها ؛
العد: عدد بايت البيانات المراد ضغطها ؛
تُرجع الوظيفة عدد البايتات المكتوبة إلى الدفق.
ملاحظة: لا يمكن كتابة بيانات الفئة المضغوطة TCompressionStream إلا إذا حاولت قراءة البيانات من الداخل ، فسيحدث استثناء "خطأ". تتم كتابة البيانات التي يجب ضغطها إلى الدفق من خلال طريقة كتابة الطريقة ، ويتم ضغطها أثناء عملية الكتابة ، ويتم حفظها في دفق الذاكرة (tmemorystream) الذي يوفره المنشئ ، ويتم تشغيل حدث OnProcess.
3) فئة إزالة الضغط tdeCompressionStream: على عكس الفئة المضغوطة TCompressionStream ، لا يمكن قراءة بياناتها إلا إذا حاولت كتابة البيانات بداخلها ، فسيحدث استثناء "خطأ".
يتم تعريف أساليبها المهمة العديدة على النحو التالي:
constructorcreate (المصدر: tstream) ؛
من بينها: المصدر هو دفق يخزن البيانات المضغوطة ؛
FunctionRead (varbuffer ؛ count: longint): longint ؛
دالة قراءة البيانات ، المخزن المؤقت للبيانات ؛
تُرجع الوظيفة عدد بايت القراءة. أثناء عملية القراءة ، يتم إلغاء ضغط البيانات ويتم تشغيل حدث OnProcess.
(الثاني)
في Delphi ، فإن الفئة الأساسية لجميع كائنات الدفق هي فئة tstream ، التي تحدد الخصائص والأساليب الشائعة لجميع التدفقات.
الخصائص المحددة في فئة tstream هي كما يلي:
1) ، الحجم: هذه الخاصية تُرجع حجم البيانات في الدفق بالبايت.
2) الموضع: تتحكم هذه الخاصية في موضع الوصول إلى المؤشرات في التدفق.
هناك أربع طرق افتراضية محددة في tstream:
1) اقرأ: هذه الطريقة تنفذ قراءة البيانات من الدفق ، وقيمة الإرجاع هي العدد الفعلي لقراءة البايتات ، والتي يمكن أن تكون أقل من أو تساوي القيمة المحددة.
2) اكتب: هذه الطريقة تنفذ كتابة البيانات في الدفق ، وقيمة الإرجاع هي عدد البايتات المكتوبة فعليًا إلى الدفق.
3) ابحث: تدرك هذه الطريقة حركة مؤشر القراءة في الدفق ، وقيمة الإرجاع هي موضع المؤشر بعد الحركة.
النموذج الأولي للوظيفة هو: functionSeek (الإزاحة: longint ؛ Origint: Word): longint ؛ افتراضية ؛ مجردة ؛
إزاحة المعلمة هو عدد بايت الإزاحة.
sofrombeginning: الإزاحة هي بيانات مسافة المؤشر تبدأ. في هذا الوقت ، يجب أن يكون الإزاحة أكبر من أو يساوي الصفر.
Sofromcurrent: الإزاحة هو الموضع النسبي للمؤشر والمؤشر الحالي بعد التحرك.
Sofromend: الإزاحة هو الموضع الذي تنتهي فيه بيانات مسافة المؤشر بعد التحرك. في هذا الوقت ، يجب أن يكون الإزاحة أقل من أو يساوي الصفر.
4) Setsize: هذه الطريقة تدرك تغيير حجم البيانات.
بالإضافة إلى ذلك ، يتم تعريف العديد من الطرق الثابتة في فئة tstream:
1) REDBUFFER: وظيفة هذه الطريقة هي قراءة البيانات من الموضع الحالي في الدفق ، مثل القراءة أعلاه.
ملاحظة: عندما يختلف عدد القراءة بايت عن عدد البايتات المراد قراءتها ، سيتم إنشاء استثناء Ereaderror.
2) TriteBuffer: وظيفة هذه الطريقة هي كتابة البيانات إلى الدفق في الموقع الحالي ، مثل الكتابة أعلاه.
ملاحظة: عندما يختلف عدد البايتات المكتوبة بالبيانات عن عدد البايتات المراد كتابة ، سيتم إنشاء استثناء eWriteRror.
3) نسخ من: وظيفة هذه الطريقة هي نسخ تدفقات البيانات من التدفقات الأخرى.
النموذج الأولي للوظيفة هو: functionCopyFrom (المصدر: tstream ؛ العد: longint): longint ؛
مصدر المعلمة هو الدفق الذي يوفر البيانات ، والعدد هو عدد بايت البيانات المنسوخة. عندما يكون العد أكبر من 0 ، فإن نسخ نسخ من البيانات من الموضع الحالي للمعلمة المصدر ؛
فئات مشتقة بشكل شائع من tstream:
tfilestream (الوصول إلى تدفقات الملفات)
tstringstream (معالجة بيانات نوع السلسلة في الذاكرة)
TmemoryStream (لمعالجة بيانات منطقة الذاكرة العاملة)
tblobstream (معالجة البيانات لحقول نوع النقطة)
TwinsocketStream (اقرأ وكتابة معالجة المقبس)
Tolestream (معالجة البيانات لواجهة com)
tresourcestream (معالجة تدفقات ملفات الموارد)
الأكثر استخدامًا هو فئة tfilestream. للوصول إلى الملفات باستخدام فئة Tfilestream ، يجب عليك أولاً إنشاء مثيل. البيان كما يلي:
constructorcreate (constfilename: string ؛ الوضع: كلمة) ؛
اسم الملف هو اسم الملف (بما في ذلك المسار)
الوضع هو طريقة فتح ملف.
الوضع المفتوح:
FMCREATE: قم بإنشاء ملف باسم الملف المحدد ، وافتحه إذا كان الملف موجودًا بالفعل.
fmopenread: افتح الملف المحدد في القراءة فقط
fmopenwrite: افتح الملف المحدد بطريقة الكتابة فقط
fmopenReadWrite: افتح الملف المحدد في وضع الكتابة
وضع المشاركة:
fmshareCompat: الوضع المشترك متوافق مع FCBS
fmshareexclusive: لا يُسمح لأي برامج أخرى بفتح الملف بأي شكل من الأشكال
fmsharedenywrite: لا يُسمح لأي برامج أخرى بفتح الملف كتابيًا
fmsharedenyread: لا يُسمح بأي برامج أخرى بفتح الملف في وضع القراءة
fmsharedenynone: يمكن للبرامج الأخرى فتح الملف بأي شكل من الأشكال
(3) ملف المورد
1) إنشاء ملفات الموارد
أولا قم بإنشاء ملف نصي عادي من .rc.
التنسيق: معرف الموارد اسم ملف مورد الكلمات الرئيسية
معرف الموارد: تسمية خاصة عند استدعاء مورد في البرنامج ؛
الكلمات الرئيسية: تحديد نوع ملف المورد ؛
الموجة: ملف المورد هو ملف صوت ؛
RCDATA: ملف JPEG ؛
AVI: AVI الرسوم المتحركة ؛
أيقونة: ملف رمز ؛
صورة نقطية: ملف صورة نقطية ؛
المؤشر: ملف المؤشر ؛
exefile: ملف exe
اسم ملف المورد: الاسم الكامل للملف المخزن على قرص ملف المورد
على سبيل المثال:
myzjyexefilezjy.exe
2) تجميع ملفات الموارد
تحت /BIN من دليل تثبيت Delphi ، استخدم BRCC32.exe لتجميع ملف المورد. بالطبع ، يمكنك أيضًا نسخ BRCC32 إلى دليل وثيقة البرنامج بشكل منفصل للاستخدام.
على سبيل المثال:
brcc32wnhoo_reg.rc
3) مرجع ملف المورد
...
تطبيق
{$ r*.dfm}
{$ rwnhoo_reg.res}
...
4) استدعاء ملفات مورد
(1) الوصول إلى صورة نقطية في ملف المورد (صورة نقطية)
image.picture.bitmap.handle: = loadbitmap (hinstance ، "معرف الموارد") ؛
ملاحظة: إذا لم يتم تحميل صورة النقطة النية بنجاح ، فسيظل البرنامج يتم تنفيذه ، ولكن لن يتم عرض الصورة. يمكنك الحكم على ما إذا كان الحمل ناجحًا بناءً على قيمة الإرجاع لوظيفة LoadBitMap.
طريقة أخرى للوصول وعرض صورة نقطية على النحو التالي
image.picture.bitmap.loadfromresourcename (Hinstance ، 'Resource Identifier') ؛
(2) الوصول إلى المؤشر في ملف المورد
Screen.cursors [] هي صفيف المؤشر. نظرًا لأن قيمة فهرس المؤشر الافتراضية في الصفيف هي 0 ، فمن الأفضل تعيين قيمة فهرس المؤشر المخصصة إلى 1 ما لم تكن تريد استبدال المؤشر الافتراضي.
screen.cursors [1]: = loadcursor (Hinstance ، "معرف الموارد") ؛
Image.Cursor: = 1 ؛
(3) الوصول إلى الرموز في ملفات الموارد
يتيح لك وضع الرمز في ملف المورد تغيير رمز التطبيق ديناميكيًا.
application.icon.handle: = loadicon (Hinstance ، 'Resource Identifier') ؛
(4) الوصول إلى AVI في ملف المورد
animate.ResName: = 'myavi' ؛ // رقم معرف الموارد
animate.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 إلى وحدة الاستخدامات
PlaySound (pchar ('mywav') ، hinstance ، snd_asyncorsnd_memoryorsnd_resource) ؛
(4) عملية ملف INI
(1) بنية ملف INI:
؛ هذا هو قسم التعليقات حول ملف INI
[العقدة]
الكلمة الرئيسية = القيمة
...
يتيح ملف INI عقدًا متعددة ، ويسمح كل عقدة بعدة كلمات رئيسية. يتم تمثيل ملف INI ، والقيمة المنطقية الحقيقية بـ 1 ، ويتم تمثيل القيمة المنطقية الخاطئة بـ 0). التعليقات تبدأ مع فاصلة منقوطة "؛".
(2) تشغيل ملف INI
1. إضافة inifiles إلى قسم الاستخدامات من الواجهة ؛
2. أضف سطرًا إلى الجزء المتغير VAR: inifile: Tinifile ؛
3. افتح ملف ini: inifile: = tinifile.create ('tmp.ini') ؛
4. اقرأ قيمة الكلمة الرئيسية:
a: = inifile.ReadString ('Node' ، 'Keyword' ، القيمة الافتراضية) ؛
B: = inifile.ReadInteger ('Node' ، 'Keyword' ، القيمة الافتراضية) ؛ // نوع integer
C: = inifile.ReadBool ('Node' ، 'Keyword' ، القيمة الافتراضية) ؛
حيث [الافتراضي] هي القيمة الافتراضية التي يتم إرجاعها عندما لا تكون الكلمة الرئيسية موجودة في ملف INI.
5. اكتب إلى ملف INI:
inifile.writeString ('Node' ، 'Keyword' ، variable أو string value) ؛
inifile.writeInteger ('Node' ، 'Keyword' ، variable أو integer value) ؛
inifile.writeBool ('Node' ، 'Keyword' ، متغير أو صحيح أو خطأ) ؛
عندما تكون عقدة ملف INI غير موجودة ، ستقوم العبارة أعلاه أيضًا بإنشاء ملف INI تلقائيًا.
6. حذف الكلمات الرئيسية:
inifile.deletekey ('node' ، 'keyword') ؛ // الكلمة الأساسية حذف
inifile.erasesecteChection ('node') ؛ // إزالة العقدة
7. عملية العقدة:
inifile.ReadSection ('node' ، tstrings variable) ؛ // يمكن قراءة جميع أسماء الكلمات الرئيسية في القسم المحدد في متغير قائمة السلسلة ؛
inifile.ReadSections (متغير tstrings) ؛ // يمكنك قراءة جميع أسماء القمم الفرعية في ملف INI في متغير قائمة السلسلة.
inifile.ReadSectionValues ('node' ، tstrings ariable) ؛ // يمكن قراءة جميع الخطوط (بما في ذلك الكلمات الرئيسية ، = ، القيم) في القسم المحدد في ملف INI في متغير قائمة السلسلة.
8. الإفراج عن: inifile.distory ؛
(5) علاقة الوثيقة
يستخدم
السجل ، شلوبج ؛
// إدراك التسجيل ذات الصلة
الإجراءات.
var
ريج: Tregistry ؛
يبدأ
ريج: = 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') ؛
ريج.
// تحديث الآن
shchangenotify (shcne_assocchanged ، shcnf_idlist ، nil ، nil) ؛
نهاية؛
2.3.
1. إنشاء ملف مشفر مؤقت
تنسيق ملف مؤقت لـ INI للتشفير:
[file1] // العقدة ، يمكن تحقيق تشفير متعدد الملفات باستخدام file1..n في البرنامج
اسم الملف = اسم الملف المضغوط
كلمة المرور = إلغاء الضغط كلمة المرور
ملفات = حجم الملف
FILEDATE = إنشاء تاريخ
ISJM = هل من الضروري إلغاء الضغط؟
إذا قمت بتنفيذ تخزين المعلومات من ملفات ومجلدات متعددة ، فيمكنك تخزين كلمة المرور الرئيسية تحت العقدة الكلية. هذه المقالة تنفذ فقط تشفير ملف واحد ، طالما أن التنسيق أعلاه يكفي.
2. دمج ملف البيانات مع ملف INI المستخدم للتشفير ، والذي يمكن تنفيذه في شكل دفق ملف.
مخطط بنية الملف المشفرة:
الشكل (1)
الشكل (2)
يمكن استخدام النموذجين أعلاه وفقًا للظروف الفعلية. تعتمد هذه المقالة بنية الشكل (1).
3. للبيانات المشفرة ، يتم استخدام تقنية ZLIB لتحقيق سعة التخزين المضغوطة وإنشاء ملفات مضغوطة جديدة.
2.4.
2.5
1. قم بإنشاء ملف برنامج قابل للتنفيذ على وجه التحديد من الضغط
2. إنشاء ملفات الموارد في 1
3. ضع ملف المورد في برنامج أداة الضغط هذه في هذه المقالة وتجميعه معًا.
4. قم بإنشاء ملف استخلاص ذاتي عن طريق دمج ملف المورد مع الملف المضغوط.
مخطط بنية ملف الاستخراج الذاتي:
5. تنفيذ تقليل الضغط الذاتي: من خلال تحلل البيانات المضغوطة المشفرة في ملفها الخاص ، ثم فك ضغط البيانات المضغوطة المشفرة المتحللة مرة أخرى وتحلل ملف البيانات الحقيقي.
2.6 برمجة النظام
هذا هو كل رمز الجزء الأساسي من تطبيق البرنامج هذا ، وهنا سنشرح جميع التفاصيل الفنية لهذا البرنامج بالتفصيل.
//wnhoo_zzz.pas
unitwnhoo_zzz ؛
واجهة
يستخدم
Windows ، النماذج ، sysutils ، الفصول ، zlib ، السجل ، inifiles ، الحوار ، shlobj ؛
يكتب
تمرير = سلسلة [20] ؛
يكتب
tmyzip = الفصل
خاص
{privatedEclarationShere}
محمية
{protectedDeclarationShere}
عام
الإجراء ؛
الإجراءات _file (infilename ، outfilename: string ؛ password: pass ؛ isjm: boolean ؛ ysbz: integer) ؛
functionJy_File (infilename: string ؛ كلمة المرور: pass = ''): boolean ؛
storeurezjywj (varfilename: string) ؛
البناء
Destructordestroy ؛ تجاوز ؛
{publicdeclarationshere}
المنشورة
{publishedDeclarationShere}
نهاية؛
تطبيق
constructortmyzip.create ؛
يبدأ
وراثي ؛ // تهيئة الجزء الموروثة
نهاية؛
// ## طلب ################################################## ###################################
// تشفير الملف الأصلي
الإجراءات Jm_File (Vfile: String ؛ vartarget: tmemorystream ؛ كلمة المرور: 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) ؛
// احصل على مسار الملف وقم بإنشاء [ملف معلومات مضغوط مشفر]
اسم الملف: = extractFilePath (paramstr (0))+'tmp.in_' ؛
inifile: = tinifile.create (اسم الملف) ؛
inifile.writeString ('file1' ، 'filename' ، extractFilename (vfile)) ؛
inifile.writeString ('file1' ، 'كلمة المرور' ، كلمة المرور) ؛
inifile.writeInteger ('file1' ، 'filesize' ، target.size) ؛
inifile.writedateTime ('file1' ، 'filedate' ، now ()) ؛
inifile.writeBool ('file1' ، 'isjm' ، isJM) ؛
inifile.free ؛
// اقرأ في [دفق ملفات المعلومات المشفرة المشفرة]
instream: = tfilestream.create (اسم الملف ، fmopenReadorFmShareExClusive) ؛
يحاول
// تابع إضافة [ملف معلومات مضغوط مشفر INI] في نهاية [دفق الملفات المضغوط المشفر المؤقت]]
instream.position: = 0 ؛
Target.seek (0 ، sofromend) ؛
target.copyfrom (inistream ، 0) ؛
// حساب حجم التيار [ملف المعلومات المضغوطة المشفرة INI]
ملفات: = inistream.size ؛
// تابع إضافة معلومات حجم [ملف المعلومات المشفرة INI المشفر] في نهاية [ملف مشفر مؤقت]]
target.writeBuffer (filesize ، sizeof (filesize)) ؛
أخيراً
instream.free ؛
DELETEFILE (اسم الملف) ؛
نهاية؛
أخيراً
TMPStream.free ؛
نهاية؛
نهاية؛
// ************************************************ ****************************************************** ****************************************************** ****************************************************** ****************************************************** ****************************************************** ****************************************************** *************************** *****************
// ضغط التدفق
الإجراءات _stream (instream ، OutStream: tstream ؛ ysbz: integer) ؛
{
instream: دفق الملف المشفر ليتم ضغطه
تفوق دفق ملف الإخراج الضغط على الضغط
YSBZ: معيار الضغط
}
var
YS: tcompressionsstream ؛
يبدأ
// يشير مؤشر التدفق إلى الرأس
instream.position: = 0 ؛
// اختيار معايير الضغط
CaseBzof
1: ys: = tcompressionsstream.create (clnone ، Outstream) ؛ // غير مضغوط
2: ys: = tcompressionsstream.create (Clfastest ، Outstream) ؛ // ضغط سريع
3: ys: = tcompressionsstream.create (Cldefault ، OutStream) ؛ // الضغط القياسي
4: ys: = tcompressionsstream.create (clmax ، OutStream) ؛ // الحد الأقصى للضغط
آخر
ys: = tcompressionsstream.create (clfastest ، OutStream) ؛
نهاية؛
يحاول
// دفق الضغط
ys.copyfrom (instream ، 0) ؛
أخيراً
ys.free ؛
نهاية؛
نهاية؛
// ************************************************ ****************************************************** ****************************************************** ****************************************************** ****************************************************** ****************************************************** ****************************************************** ************************* ***********************
// تخفيف الضغط
الإجراءات _stream (instream ، OutStream: tstream) ؛
{
Instream: ملف دفق مضغوط أصلي
Outstream: قم بفك ضغط ملف البث
}
var
JYL:
buf: Array [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 ؛
نهاية؛
نهاية؛
// ************************************************ ****************************************************** ****************************************************** ****************************************************** ****************************************************** ****************************************************** ****************************************************** *************************** *****************
// إدراك التسجيل ذات الصلة
الإجراءات.
var
ريج: Tregistry ؛
يبدأ
ريج: = 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') ؛
ريج.
// تحديث الآن
shchangenotify (shcne_assocchanged ، shcnf_idlist ، nil ، nil) ؛
نهاية؛
// ضغط الملفات
الإجراءات myzip.ys_file (infilename ، outfilename: string ؛ password: pass ؛ isjm: boolean ؛ ysbz: integer) ؛
{
Infilename: // يجب ضغط الملفات المشفرة
outfilename: // ضغط الملف الذي تم إنشاؤه بعد التشفير
كلمة المرور: // إلغاء ضغط كلمة المرور
YSBZ: // معيار الضغط
}
var
instream: tmemorystream ؛ // دفق مؤقت بعد تشفير الملف
Outstream: Tfilestream ؛ // ضغط دفق ملفات الإخراج
يبدأ
// إنشاء [دفق مؤقت بعد تشفير الملف]
instream: = tmemorystream.create ؛
// تشفير الملف
jm_file (infilename ، instream ، كلمة المرور ، isJM) ؛
// إنشاء دفق ملفات الإخراج المضغوط
OutStream: = tfilestream.create (outfilename ، fmcreate) ؛
يحاول
// [دفق مؤقت بعد تشفير الملف] ضغط
ys_stream (instream ، OutStream ، ysbz) ؛
أخيراً
Outstream.free ؛
enterstream.free ؛
نهاية؛
نهاية؛
// فك ضغط الملف
functionTmyzip.jy_file (infilename: string ؛ كلمة المرور: pass = ''): منطقية ؛
var
instream ، instream ، filestream_ok: tfilestream ؛
{
instream: // اسم ملف unzip
instream: // ini دفق الملفات المؤقتة
FileStream_ok: // قم بفك ضغط ملف OK
}
Outstream: TmemoryStream ؛ // دفق الذاكرة المؤقت
inifile: tinifile ؛ // ملف INI مؤقت
ملفات: integer ؛ // حجم ملف كلمة المرور
ResultValue: Boolean ؛ // قيمة الإرجاع
يبدأ
يحاول
instream: = tfilestream.create (infilename ، fmopenread) ؛
يحاول
Outstream: = tmemorystream.create ؛
يحاول
jy_stream (instream ، OutStream) ؛
// إنشاء ملف INI مؤقت
instream: = tfilestream.create (extractFilePath (paramstr (0))+'tmp.in _' ، fmcreate) ؛
يحاول
// أشر إلى موضع متغير نوع عدد صحيح يخزن المعلومات التي تم فك تشفيرها
Outstream.keek (-sizeof (filesize) ، sofromend) ؛
// اقرأ في معلومات متغيرة
Outstream.ReadBuffer (ملفات ، sizeof (filesize)) ؛
// أشر إلى موقع المعلومات التي تم فك تشفيرها
Outstream.keek (-(Filesize+sizeof (filesize)) ، sofromend) ؛
// اقرأ المعلومات التي تم فك تشفيرها في دفق INI
instream.copyfrom (OutStream ، 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 (كلمة المرور) ثم
ResultValue: = صحيح
آخر
ResultValue: = false ؛
نهاية
آخر
ResultValue: = صحيح ؛
Ifresultvaluethen
يبدأ
filestream_ok: = tfilestream.create (extractFilePath (paramstr (1))+inifile.ReadString ('file1' ، 'filename' ، 'wnhoo.zzz') ، fmcreate) ؛
يحاول
Outstream.position: = 0 ؛
FileStream_ok.copyfrom (OutStream ، inifile.ReadInteger ('file1' ، 'filesize' ، 0)) ؛
أخيراً
filestream_ok.free ؛
نهاية؛
نهاية؛
inifile.free ؛
أخيراً
// حذف ملف INI المؤقت
deletefile (extractFilePath (paramstr (0))+'tmp.in_') ؛
نهاية؛
//
أخيراً
Outstream.free ؛
نهاية؛
أخيراً
instream.free ؛
نهاية؛
يستثني
ResultValue: = false ؛
نهاية؛
النتيجة: = resultvalue ؛
نهاية؛
// خلق الاستخراج الذاتي
الإجراءات myzip.zjywj (varfilename: string) ؛
var
Myres: Trsourcestream ؛ // تخزين ملف EXE Sextract Selection مؤقتًا
myfile: tfilestream ؛ // دفق الملف الأصلي
Xfilename: String ؛ // اسم الملف المؤقت
file_ok: tmemorystream ؛ // دفق الذاكرة للملف الذي تم إنشاؤه
ملفات: integer ؛ // حجم الملف الأصلي
يبدأ
iffilexists (اسم الملف) ثم
يبدأ
// إنشاء دفق الذاكرة
file_ok: = tmemorystream.create ؛
// قم بإصدار ملف المورد-الذات-استخراج ملف exe
myres: = tresourcestream.create (hinstance ، 'myzjy' ، pchar ('exefile')) ؛
// اقرأ الملف الأصلي في الذاكرة
myfile: = tfilestream.create (اسم الملف ، fmopenRead) ؛
يحاول
myres.position: = 0 ؛
file_ok.copyfrom (myres ، 0) ؛
file_ok.keek (0 ، sofromend) ؛
myfile.position: = 0 ؛
file_ok.copyfrom (myfile ، 0) ؛
file_ok.keek (0 ، sofromend) ؛
ملفات: = myfile.size ؛
file_ok.writeBuffer (filesize ، sizeof (filedize)) ؛
file_ok.position: = 0 ؛
Xfilename: = changefileStext (اسم الملف ، ". exe ') ؛
file_ok.savetofile (xfilename) ؛
أخيراً
myfile.free ؛
myres.free ؛
file_ok.free ؛
نهاية؛
DELETEFILE (اسم الملف) ؛
اسم الملف: = xfilename ؛
نهاية؛
نهاية؛
// ## طلب ################################################## ###################################
DestRuctorTmyzip.destroy ؛
يبدأ
وراثي DeritedDestroy.
نهاية؛
نهاية.
3. الخلاصة
توفر لنا بيئة البرمجة المرئية الجديدة من Delphi أداة لتطوير تطبيقات Windows مريحة وسريعة. بالنسبة لمطوري البرامج ، فإن استخدام Delphi لتطوير برامج التطبيق سيؤدي بلا شك إلى تحسين كفاءة البرمجة. في Delphi ، يمكنك بسهولة استخدام التدفقات لتنفيذ نماذج البيانات المختلفة مثل معالجة الملفات ومعالجة الذاكرة الديناميكية ومعالجة بيانات الشبكة وما إلى ذلك ، وستعمل برامج الكتابة على تحسين الكفاءة بشكل كبير.
مراجع:
1. مساعدة نظام دلفي
2. فنغ تشايكانغ.
3.