تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
معلومة: System.IO.Packaging namespace
#1
بعد إصدار .NET Framework 3.0 أسبح بوسعنا استخدام مجال الأسماء System.IO.Packaging كبديل عن الفئتين DeflateStream وGZipStream لضغط الملفات لأن هاتين الفئتين لاتدعمان تنسيق الملف ZIP بشكل كامل, ومن الواضح أهمية هذه الميزة, لأن استخدام ملفات Zip شائع وقياسي في أنظمة تشغيل Windows,لهذا قدمت Microsoft الفئة System.IO.Packaging.Package, وبالرغم من ذلك فإنها تبدو غامضة, لأن استخدامها نادر, وأرجو بعد هذا الموضوع ان لاتخفى على أحد ويستخدمها الجميع Smile


ملاحظة استخدام الفئة يقتصر فقط على إصدار .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, ستلاحظ أن الملف الجديد الذي قمت بإضافته غير موجود مع الملفات الأخرى.


لتحميل المثال من هنا


مترجم بتصرف
الرد }}}}
تم الشكر بواسطة:


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  معلومة ::: Build Error RaggiTech 0 304 09-10-12, 03:41 PM
آخر رد: RaggiTech
  معلومة ::: StringBuilder RaggiTech 2 408 09-10-12, 11:54 AM
آخر رد: RaggiTech
  معلومة- كيف تحسن أداء XMLSerializer باستخدام SGen.exe Tool RaggiTech 0 345 09-10-12, 11:48 AM
آخر رد: RaggiTech
  معلومة: Microsoft FxCop Analysis Tool Islam Ibrahim 0 428 17-09-12, 12:51 PM
آخر رد: Islam Ibrahim

التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم