الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

تخزين ملف ضمن exe البرنامج واستعادته أثناء التشغيل

مغلق
بدأه محمد سامر أبو سلو في 21 أكتوبر 2005 · 29 رد · 4,098 مشاهدة · في Microsoft Visual Basic.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

منذ فترة طرحت موضوع في المنتدى بعنوان كيف: تخزين ملف ضمن exe البرنامج

ويعتبر هذا الموضوع تتمة له

وهذا رابط الموضوع القديم لمن يحب الاطلاع

تخزين ملف أكسس ضمن الملف التنفيذي للبرنامج واستعادته أثناء التشغيل

أولا - أضف للمشروع الحالي ملف الأكسس الذي سيستخدمه مشروعك كقاعدة بيانات ثم غير خاصية Build Action له إلى Embedded Resource وذلك ليتم تضمينه ضمن الملف التنفيذي للمشروع عند ترجمته

ثانيا - أضف الاستيرادات التالية في أعلى الملف الذي ستستخدم الكود فيه حتى يعمل بشكل صحيح

Imports System.IO

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

     ' إحضار اسم المجمع الذي يتم تشغيله حاليا
        Dim Ref As Reflection.Assembly = System.Reflection.Assembly.GetExecutingAssembly()
        ' قراءة الملف المخزن ووضعه في متغير من نوع stream
        Dim ResStr As Stream = Ref.GetManifestResourceStream(Ref.GetName.Name & ".db1.mdb")

        ' إنشاء متغير مؤقت من نوع مصفوفة بايتات
        Dim DbBuff(ResStr.Length - 1) As Byte
        ' قراءة المعلومات من الستريم ووضعها في المتغير
        ResStr.Read(DbBuff, 0, CInt(ResStr.Length))
        ' عرض رسالة بطول البايتات المقروءة
        MsgBox(DbBuff.Length)
        ' إنشاء متغير من نوع filestream ليحمل الملف الذي سيتم التخزين فيه
        Dim Fs As New FileStream("d:\temp\samer.mdb", FileMode.Create)
        ' إنشاء متغير من نوع BinaryWriter
        Dim Bw As New BinaryWriter(Fs)
        ' كتابة البايتات في المتغير المؤقت إلى الملف ثم إغلاق الملف
        Bw.Write(DbBuff)
        Bw.Flush()
        Bw.Close()
        ' عرض رسالة بالإنتهاء
        MsgBox("Done")

وبعد انتهاء تنفيذ الكود المذكور يمكنك الآن ربط قاعدة البيانات الجديدة ضمن مشروعك واستخدامها كما تشاء.

وبهذا نكون قد خزنا قاعدة البيانات الهيكلية الأساسية ضمن الملف التنفيذي للبرنامج واستعدناها عند الحاجة

ملاحظة: يمكن استخدام الطريقة السابقة بشكل مشابه لتخزين أي ملف ضمن الملف التنفيذي للبرنامج واستعادته عند الحاجة

يرجى استخدام الكود المعدل الموجود في جوابي على أحد الإخوة لاحقا في هذا الموضوع

كما توجد أمثلة مرفقة لاحقا

تم تعديل هذه المشاركة بواسطة محمد سامر أبو سلو في 21 يونيو 2007 في 21:09

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#2

فكرة رائعة الف شكر

<span style='color:green'>سؤل ابن عباس عن علمه كيف جمعه فقال :( أوتيت لسانا سؤولا وقلبا عقولا)</span>

#3

لاشكر على واجب

إذا كان يوجد تساؤل تفضل

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#4

السلام عليكم و رحمة الله و بركاته

سؤال يطرح نفسه ....

هنا يعتبر ال ال mdb نسخة ثابته و لكن هل من الممكن بعد التعديل فيها أدخالها لل exe ?????

أعتقد أن هذا ممكن ما دامت ال mdb تعتبر Resource

أخوك عمرو عيسي

#5

الصراحة وقت حطيت الكود كنت عم بفكر بنفس تفكيرك بس ما قدرت جرب لحتى جاوبك لأني حاليا مريض ولا استطيع التركيز في أي شئ لذا لم أتابع العمل في الكود

بس يا أخ عمرو لاتحدد نفسك بملف الـ mdb الكود هون بينفع لأي نوع من أنواع الملفات وأنا بس جربت على mdb لأني عاوزه لمشروع بدي بلش فيه إن شاء الله

تم تعديل هذه المشاركة بواسطة samerselo في 25 أكتوبر 2005 في 11:30

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#6

السلام عليكم و لاحمة الله و بركاته

أخ محمد أنا لا أحد نفسي بال mdb ولكن لأنه ما ذكر في المثال فأنا أتناقش به ليس أكثر و لا أقل و سوف أحاول أن شاء الله أيجاد طريقة لهذا و ألف سلامة عليك و يا رب تقوم بالسلامة

أخوك عمرو عيسي

#7

شكرا لك أخ عمرو

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#8

اخيرا وجدت احدا يتكلم عما اريد ، شكرا جزيلاً يااخ محمد سامر

لكن مشكلتى ان اود تضمين ملفات pdf كملف مصدر بحيث لا يستطيع احد نسخها من البروجرام فايلز( لا اقصد النسخ منها فهذا يمكن منعه بالاكروبات رايتر ولا اقصد وضع كلمة سر ) بل اقصد عدم نسخ الملفات من البروجرام فايلز ووضعها فى اى مكان اخر

واستخدمت

axacropdf.loadfile("filename.extension")

وبالفعل يتم فتح الملفات فى الاداة axacropdf

بعد وضع الملفات فى المجلد bin

داخل المجلد debug

والمشكلة الآن هى انى بعد ان اعمل نشر للبرنامج لا يتضمن ملفات البى دى اف لا اعرف لماذا فعند الضغط على زر العرض تظهر رسالة خطأ تفيد بأن هناك ادة com

لا تستطيع ان تجد الملف

فما العمل الآن لأنى اريد وضع هذه الملفات كملفات مصدر كما شرح الاخ محمد سامر

فاين اضعها وكيف استغلها ؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟

وجزاكم الله خيرا

كلمتان ثقيلتان فى الميزان حبيبتان الى الرحمن

" سبحان الله وبحمــــــــــــــــــــــــــــــــــده ، سبحان اللــــــــــــــــــــــــــــــــــــــه العظـــــــــــــيـم "

#9

- بالنسبة لتخزين ملف PDF ضمن الملف التنفيذي فيمكنك الاستعانة بنفس الكود السابق وسيعمل معك جيدا

- بالنسبة لموضوع منع النسخ من مجلد Program Files فهذا متعلق بصلاحيات ويندوز وأقترح وضع موضوع مستقل عنه

- بالنسبة لمشكلتك مع أداة Com إن كنت تستخدم التحكم الخاص بـ Acrobat Reader أعتقد تأكد من وجود نفس نسخة Adobe Acrobat على الجهاز الآخر أو إن كنت ضمنت التحكم ضمن برنامج الإعداد فالتحكم يحتاج إلى تسجيل باستخدام Regsvr32 ونسخه إلى الجهاز الآخر غير كافي و أقترح استخدام محرك البحث هنا وفي قسم VB6 لتجاوز هذه المشكلة

تم تعديل هذه المشاركة بواسطة محمد سامر أبو سلو في 17 يونيو 2007 في 22:37

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#10

شكرا أخي محمد سامر أبو سلو على هذه المشاركة :lol:

ولكن لدي سؤال بسيط متعلق بهذه المشاركة :)

(السؤال هو: هل أستطيع أن أجعل البرنامج مثل المجلدات(نسخ,نقل,إضافة

مثل الصورة الموجودة في المرفقات :)

إسم البرنامج "app.exe"حيث

post-114540-1182156175_thumb.gif

أرجو الرد السريع أخي :(

#11

طبعا لأ لأن الملف يخزن في الملف التنفيذي كـ Binary Resource

ولاحظ أنني حتى الآن لم أجب على سؤال الأخ عمرو عيسى بخصوص إعادة الملف لداخل الملف التنفيذي بعد التعديل عليه لعدم تمكني من الحصول على إجابة مرضية بهذا الخصوص

تم تعديل هذه المشاركة بواسطة محمد سامر أبو سلو في 18 يونيو 2007 في 12:34

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#12

جزاك الله ألف خير بس لو سمحت ممكن تعمل مثال بسيط للموضوع وشكرا

#13
كبير المبرمجين العرب كتب:
جزاك الله ألف خير بس لو سمحت ممكن تعمل مثال بسيط للموضوع وشكرا

عدلت قليلا في شكل الكود حتى أصبح إجراء يمكن استخدامه لأغراض متعددة

يحتاج إلى الاستيرادات التالية

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

مرفق مثال عملي عن الفكرة

StoreAccessDBinEXE.rar

تم تعديل هذه المشاركة بواسطة محمد سامر أبو سلو في 18 يونيو 2007 في 14:22

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#14

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

وهذا ينطبق أيضا عند تجريب الكود الأول في الموضوع في السطر الذي بدايته Dim ResStr As Stream

تم تعديل هذه المشاركة بواسطة محمد سامر أبو سلو في 19 يونيو 2007 في 11:12

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#15

تمت قسمة الموضوع إلى موضوعين ابتداء من مشاركة الأخ MiCcSoft وهذا رابط الموضوع الجديد دمج ملف ضمن الملف التنفيذي للبرنامج واستعادته

وذلك بسبب اختلاف طريقة الدمج ففي حين كانت فكرتي هي تخزينه كـ Resource أثناء التطوير ومن ثم استعادته عند الحاجة أثناء التنفيذ إلا أن الأخ MiCcSoft قد نقل الفكرة إلى الدمج والاستعادة أثناء التشغيل

تم تعديل هذه المشاركة بواسطة محمد سامر أبو سلو في 21 يونيو 2007 في 01:35

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#16

جزاك الله الف خير اخي محمد و الى الامام دائماً و ابداً, بالتوفيق للجميع

في المثال يتضح المقال

#17

وجزاك الله خيرا أخي الشهاب الحارق فجوابك على الموضوع كيف: تخزين ملف ضمن exe البرنامج كان الأساس لهذا الموضوع

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#18

لقد مرة سنتان على ذلك , سبحان الله كأنه البارحة, لكنك أوفيت بالوعد و تعلمت منك ما رجوته منك,

حقيقة لا أعرف كيف أشكرك, جزاك الله خير على ما تقدم اخي محمد,

السلام عليكم.

في المثال يتضح المقال

#19

15193.gif

9bf91a8d60.jpg

#20

لدى مشكلة لا اجد لها حلاً :(

فعلت كما ذكر الأخ محمد بارك الله فيه :)

ادرجت Imports System.IO فى اعلى الملف

وكتبت الكود ولكن هناك مشكلة لا افهمها :unsure:

ولا اعرف كيف اربط بين axacropdf1.loadfile وبين الكود الذى تكرمت بشرحه

ارجو ان تطلع على هذا المثال الصغير الذى يوضح المشكلة وتقول لى رأيك

هذا المثال ليس به الا زر واحد واداة axacropdf

وملف pdf صغير موضوع فى مجلد debug داخل المجلد bin ومضاف ايضا كـ rescourse file

وجعلته ايضاً كـ embedded resourse

اريد عند الضغط على الزر ان يعرض الملف داخل الاداة وهذا فعلته ولكن المشكلة فى دمج الملف مع الملف التنفيذى عند النشر بحيث لا يعرض كملف بى دى اف فى البروجرام فايلز

ارجو مشاهدة المثال واخبارى بكيفية حل هذه المشكلة لأنى فقدت الامل فى انى احلها

وجزاك الله عنى خيرا

sample.rar

كلمتان ثقيلتان فى الميزان حبيبتان الى الرحمن

" سبحان الله وبحمــــــــــــــــــــــــــــــــــده ، سبحان اللــــــــــــــــــــــــــــــــــــــه العظـــــــــــــيـم "

#21

أخ abdlellah الأخطاء لديك التي أدت إلى المشاكل التي تواجهها

1 - هو وضع ملف الـ PDF في مجلد Bin\Debug كان يجب وضعه في مجلد المشروع مباشرة

2 - إضافة ملف لاداعي له Resource1.resx أدى إلى تعقيد العملية أكثر بدون داعي

تم تعديل هذه المشاركة بواسطة محمد سامر أبو سلو في 21 يونيو 2007 في 19:21

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#22

الإجراءات الصحيحة حتى لاتواجه هكذا مشاكل

1- انسخ الملف الذي تريد استخدامه لمجلد المشروع مباشرة إياك ونسخه لداخل المجلد Bin كما يفعل الكثير - ولاتضف أي ملفات Resource لاداعي لها

2- في الـ Solution Explorer انقر بالماوس اليميني على المشروع ثم اختر Add/Existing Item وأضف الملف الذي تريده للمشروع

3 - غير خاصية Build Action للملف المضاف إلى Embedded Resource

4 - استخدم الكود النهائي كما في المشاركة رقم 13 في جوابي لكبير المبرمجين العرب

5- حمل المثال المرفق مع جوابي هذا والمثال المرفق مع المشاركة المذكورة من أجل رؤية كيف تتم العملية بصورة صحيحة

PDFSample.rar

تم تعديل هذه المشاركة بواسطة محمد سامر أبو سلو في 21 يونيو 2007 في 20:33

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#23

يمكن تطوير الفكرة بعدة أشكال

مثلا يمكن تعديل الإجراء لينقل الملف إلى 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()

ولم أجد داعي لوضع التعليقات ضمن الكود بافتراض أن المتابع للموضوع من الأول قد فهم آلية العمل والفكرة هنا

مرفق مثال عن طريقة استخدام MemoryStream

EbeddedToMemoryStream.rar

تم تعديل هذه المشاركة بواسطة محمد سامر أبو سلو في 21 يونيو 2007 في 20:30

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#24

أخي محمد سامر أبو سلو لم تجب على سؤالي

(السؤال هو: هل أستطيع أن أجعل البرنامج مثل المجلدات(نسخ,نقل,إضافة

مثل الصورة الموجودة في :)

إسم البرنامج "app.exe"حيث

post-114540-1182156175.gif

أرجو الرد السريع أخي :(

#25

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

وإن كنت تقصد غير ذلك افتح موضوعا مستقلا تشرح فيه فكرتك بالتفصيل

مع انني قد أجبتك سابقا على سؤالك

اقتباس
طبعا لأ لأن الملف يخزن في الملف التنفيذي كـ Binary Resource

تم تعديل هذه المشاركة بواسطة محمد سامر أبو سلو في 22 يونيو 2007 في 21:03

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

هذا الموضوع مغلق.

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…