منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب
تخزين ملف ما ضمن Exe البرنامج أثناء التطوير واستعادته أثناء التشغيل - نسخة قابلة للطباعة

+- منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب (http://vb4arb.com/vb)
+-- قسم : قسم لغة الفيجوال بيسك VB.NET (http://vb4arb.com/vb/forumdisplay.php?fid=182)
+--- قسم : قسم مقالات VB.NET (http://vb4arb.com/vb/forumdisplay.php?fid=184)
+--- الموضوع : تخزين ملف ما ضمن Exe البرنامج أثناء التطوير واستعادته أثناء التشغيل (/showthread.php?tid=4956)



تخزين ملف ما ضمن Exe البرنامج أثناء التطوير واستعادته أثناء التشغيل - RaggiTech - 03-10-12

كاتب الموضوع : samerselo

في البداية سنحتاج للاستيرادات التالية كي يعمل الكود معنا

كود :
Imports System.Reflection
Imports System.IO
وهذا هو كود الاستعادة مدعما بالتعليقات الكاملة التي تشرح كيفية عمله

كود :
' إجراء الغرض منه استخراج أي مصدر ثنائي مضمن ضمن الملف التنفيذي للمشروع
' وتخزينه في ملف
Private Sub ExtractBinaryResource(ByVal ToStoreFileName As String, ByVal EmResourceName As String)
' استخدام حلقة اصطياد الأخطاء
Try
' احضار اسم المجمع الحالي
Dim Ref As Assembly = Assembly.GetExecutingAssembly
' انشاء stream يتضمن المصدر الثنائي الموجود في المجمع
Dim ResStr As Stream = Ref.GetManifestResourceStream(Ref.GetName.Name & "." & EmResourceName)

' إنشاء مصفوفة بايتات لتحمل البيانات الثنائية
' وبطول البياناات التي ستتم قراءتها
Dim TmBuff(ResStr.Length - 1) As Byte
' قراءة البيانات الثنائية من الـ Stream
' إلى مصفوفة البايتات
ResStr.Read(TmBuff, 0, ResStr.Length)

' إنشاء FileStream يستخدم لتخزين محتويات المصفوفة المؤقتة إلى القرص
Using Fs As New FileStream(ToStoreFileName, FileMode.Create)
' إنشاء كاتب بيانات ثنائية يعتمد على FileStream
Using Bw As New BinaryWriter(Fs)
' كتابة مصفوفة البياتات للقرص
Bw.Write(TmBuff)
' كتابة جميع البيانات للقرص وتفريغ مخازن الذاكرة المؤقتة
Bw.Flush()
End Using
End Using

Catch ex As Exception
' إظهار رسالة بالخطأ في حال حدوثه
MsgBox(ex.Message)
End Try
End Sub
والإجراءات الصحيحة لتخزين الملف أثناء التطوير حتى لانواجه مشاكل أثناء التنفيذ

1- انسخ الملف الذي تريد استخدامه لمجلد المشروع مباشرة إياك ونسخه لداخل المجلد Bin كما يفعل الكثير - ولاتضف أي ملفات Resource لاداعي لها
2- في الـ Solution Explorer انقر بالماوس اليميني على المشروع ثم اختر Add/Existing Item وأضف الملف الذي تريده للمشروع
3 - غير خاصية Build Action للملف المضاف إلى Embedded Resource


ملاحظة: قيمة المتغير EmResourceName حساسة لحالة الأحرف أي عندما تمرر اسم المصدر الثنائي - ملف أكسيس مثلا - يجب أن تطابق حالة الأحرف الممررة هنا لحالة الأحرف المكتوب بها الاسم عند تخزين الملف أي تأكد من مطابقة حالة الأحرف بالضبط لاسم الملف كما يظهر بعد إضافته في الخطوة رقم 2

ملاحظة: هذا الكود يعمل مع الكثير من الملفات مثلا ملف MDB أو PDF أو JPG أو BIN أو DAT أو ... استخدم مخيلتك


تخزين ملف ما ضمن Exe البرنامج أثناء التطوير واستعادته أثناء التشغيل - RaggiTech - 03-10-12

كما يمكننا تطوير كود الاستعادة بعدة أشكال حسب الحاجة فمثلا يمكننا تعديل الإجراء لينقل الملف إلى MemoryStream عوضا عن Filestream وبهذا يخزن في ذاكرة مؤقتة بحيث يمكن استخدامه ويكون الإجراء المعدل ليعيد memorystream كما يلي

كود :
Private Sub ExBinResToMemoryStream(ByVal EmResourceName As String, _
ByRef RetMemStr As MemoryStream)

Try
Dim Ref As Assembly = Assembly.GetExecutingAssembly
Dim ResStr As Stream = Ref.GetManifestResourceStream(Ref.GetName.Name & "." & EmResourceName)

Dim TmBuff(ResStr.Length - 1) As Byte
ResStr.Read(TmBuff, 0, ResStr.Length)
RetMemStr = New MemoryStream(ResStr.Length)
RetMemStr.Write(TmBuff, 0, ResStr.Length)

Catch ex As Exception
MsgBox(ex.Message)
End Try
End Sub


فإذا افترضنا أن الملف هو صورة باسم Pic0.jpg مثلا وأردنا تحميلها في مربع الصور نستخدم الكود التالي

كود :
Dim Ms As MemoryStream
ExBinResToMemoryStream("Pic0.jpg", Ms)
Me.PictureBox1.Image = New Bitmap(Ms)
Ms.Close()
Ms.Dispose()
وهذا مثال عن استخدام الكود الأول الذي يستعيد إلى ملف على القرص

كود :
' فتح صندوق حوار فتح
If Me.SFD.ShowDialog = Windows.Forms.DialogResult.OK Then
' استدعاء الإجراء وتمرير اسم الملف واسم المصدر الثنائي
ExtractBinaryResource(Me.SFD.FileName, "test.mdb")
' عرض رسالة بعد الانتهاء
MsgBox("Ok")
End If