17-09-12, 01:02 PM
بعد إصدار .NET Framework 3.0 أسبح بوسعنا استخدام مجال الأسماء System.IO.Packaging كبديل عن الفئتين DeflateStream وGZipStream لضغط الملفات لأن هاتين الفئتين لاتدعمان تنسيق الملف ZIP بشكل كامل, ومن الواضح أهمية هذه الميزة, لأن استخدام ملفات Zip شائع وقياسي في أنظمة تشغيل Windows,لهذا قدمت Microsoft الفئة System.IO.Packaging.Package, وبالرغم من ذلك فإنها تبدو غامضة, لأن استخدامها نادر, وأرجو بعد هذا الموضوع ان لاتخفى على أحد ويستخدمها الجميع
ملاحظة استخدام الفئة يقتصر فقط على إصدار .Net Framework 3.0 أو أحدث لذلك يمكنك
أولا أضف المرجع (WindowsBase) إلى مشروعك لكي يتاح استخدام الفئة بشكل صحيح.
أول مايجب القيام به هو فتح ملف حزمة Package (المثال مرفق في آخر الموضوع)
بعد قيامك بفتح الحزمة يمكنك إضافة ملفات إليها
يجدر الإشارة إلى ان الإجراء AddFileToZip ليس أحد أعضاء الفئة Package وإنما هو إجراء يجب كتابته بشكل يدوي, ويكون مخطط الإجراء كما يلي: تحويل الملف المراد إضافته إلى الحزمة على شكل مصفوفة من النوع Byte, ثم إنشاء Package part وإضافة مصفوفة البايتات إلى هذا الـ part.
لاحظ أنه من غير اللائق استخدام هذا الإجراء مع ملفات ذات الحجم الكبير.
جرب الان التطبيق (المثال المرفق) وسترى النتيجة, افتح الملف c:\temp\MyZipTestFile.zip
باستخدام أحد برامج الضغط (winrar)
ستلاحظ ظهور ملف آخر مع الملفات المضغوطة, وهو الملف المسمى [Content_Types].xml
الآن يمكنك بسهولة استخراج الملفات بدون مشاكل, والإجراء التالي سيقوم بالمهمة
الإجراء السابق يقوم باستخراج الأجزاء parts (أو الملفات) ويستخدم Streams لكتابتها إلى القرص .
جرب المثال المرفق لاستخراج الملفات
قيود على استخدام هذه الفئة:
ابحث عن الملف الذي قام البرنامج بإنشائه (على c:\temp) وأضف ملفا ما يدويا إليه عن طريق برنامج winzip او winrar, بعد ذلك شغل التطبيق المرفق وقم باستخراج الملفات إلى المجلد Test في المجلد debug, ستلاحظ أن الملف الجديد الذي قمت بإضافته غير موجود مع الملفات الأخرى.
لتحميل المثال من هنا
مترجم بتصرف
ملاحظة استخدام الفئة يقتصر فقط على إصدار .Net Framework 3.0 أو أحدث لذلك يمكنك
أولا أضف المرجع (WindowsBase) إلى مشروعك لكي يتاح استخدام الفئة بشكل صحيح.
أول مايجب القيام به هو فتح ملف حزمة Package (المثال مرفق في آخر الموضوع)
كود :
Dim objZip As Package = ZipPackage.Open(kZipFile, FileMode.OpenOrCreate, FileAccess.ReadWrite)
بعد قيامك بفتح الحزمة يمكنك إضافة ملفات إليها
كود :
AddFileToZip(objZip, IO.Path.Combine(Application.StartupPath, "Test1.txt"))
يجدر الإشارة إلى ان الإجراء AddFileToZip ليس أحد أعضاء الفئة Package وإنما هو إجراء يجب كتابته بشكل يدوي, ويكون مخطط الإجراء كما يلي: تحويل الملف المراد إضافته إلى الحزمة على شكل مصفوفة من النوع Byte, ثم إنشاء Package part وإضافة مصفوفة البايتات إلى هذا الـ part.
كود :
Private Sub AddFileToZip(ByVal pZip As Package, ByVal pFileToAdd As String)
'Validate if the file exists
If Not File.Exists(pFileToAdd) Then
Throw New FileNotFoundException("AddFileToZip cannot process file " + pFileToAdd)
End If
'Create a URI from the filename to zip (to ensure the name is valid)
Dim partURI As New Uri(CreateUriFromFilename(pFileToAdd), UriKind.Relative)
'Create a Package Part
Dim pkgPart As PackagePart = pZip.CreatePart(partURI, _
Net.Mime.MediaTypeNames.Application.Zip, _
CompressionOption.Normal)
'Read the file into a byte array
Dim arrBuffer As Byte() = File.ReadAllBytes(pFileToAdd)
'Add the array of byte to the Package
pkgPart.GetStream().Write(arrBuffer, 0, arrBuffer.Length)
End Sub
لاحظ أنه من غير اللائق استخدام هذا الإجراء مع ملفات ذات الحجم الكبير.
جرب الان التطبيق (المثال المرفق) وسترى النتيجة, افتح الملف c:\temp\MyZipTestFile.zip
باستخدام أحد برامج الضغط (winrar)
ستلاحظ ظهور ملف آخر مع الملفات المضغوطة, وهو الملف المسمى [Content_Types].xml
الآن يمكنك بسهولة استخراج الملفات بدون مشاكل, والإجراء التالي سيقوم بالمهمة
كود :
Private Sub ExtractFromZip(ByVal pZipFilename As String, ByVal pOutputPath As String)
Using pkgMain As Package = Package.Open(pZipFilename, FileMode.Open, FileAccess.Read)
For Each pkgPart As PackagePart In pkgMain.GetParts()
Dim strTarget As String = Path.Combine(pOutputPath, CreateFilenameFromUri(pkgPart.Uri))
Using stmSource As Stream = pkgPart.GetStream(FileMode.Open, FileAccess.Read)
Using stmDestination As Stream = File.OpenWrite(strTarget)
Dim arrBuffer(10000) As Byte
Dim intRead As Integer
intRead = stmSource.Read(arrBuffer, 0, arrBuffer.Length)
While intRead > 0
stmDestination.Write(arrBuffer, 0, intRead)
intRead = stmSource.Read(arrBuffer, 0, arrBuffer.Length)
End While
End Using
End Using
Next
End Using
End Sub
الإجراء السابق يقوم باستخراج الأجزاء parts (أو الملفات) ويستخدم Streams لكتابتها إلى القرص .
جرب المثال المرفق لاستخراج الملفات
قيود على استخدام هذه الفئة:
ابحث عن الملف الذي قام البرنامج بإنشائه (على c:\temp) وأضف ملفا ما يدويا إليه عن طريق برنامج winzip او winrar, بعد ذلك شغل التطبيق المرفق وقم باستخراج الملفات إلى المجلد Test في المجلد debug, ستلاحظ أن الملف الجديد الذي قمت بإضافته غير موجود مع الملفات الأخرى.
لتحميل المثال من هنا
مترجم بتصرف