PDA

View Full Version : نمایش فایل های داخل ریسورس پروژه



xminxmin
پنج شنبه 25 اردیبهشت 1393, 10:08 صبح
سلام دوستان
من یه سری فایل رو در Resources پروژه اضافه کردم
از طرفی من یه لیست دارم رو فرم برنامه که آیتم هاش نام های همون فایل های اضافه شده هست.

سوال اینه: من می خوام با کلیک روی هر آیتم از لیست، فایل مربوطه و همنام با اون در Resources اجرا بشه.
ممنون میشم راهنمایی کنید.

xminxmin
شنبه 27 اردیبهشت 1393, 07:45 صبح
سلام
تعجب می کنم! یعنی راهی نیست که هیچ کس جواب نداده؟
اساتید را چه شده است؟! :افسرده:

aliagamon
شنبه 27 اردیبهشت 1393, 08:50 صبح
شما نمیتونید مستقیم اونا رو باز کنین چون در اصل یه ارایه از بایت هست که تو فایل exe قرار داره و وقتی بهشون دسترسی پیدا میکنین درواقع همون ارایه رو بهتون برمیگردونه ولی میتونین اونا رو روی هارد بنویسین و اجرا کنین یعنی تو یه فلدر temp برای مثال تو appdata توی پوشه ی local معمولا میریزن (یه فلدر به اسم برنامه درست میکنن):لبخند:
از WriteAllBytes استفاده کنین
http://msdn.microsoft.com/en-us/library/system.io.file.writeallbytes(v=vs.110).aspx?cs-save-lang=1&cs-lang=vb#code-snippet-1

xminxmin
شنبه 27 اردیبهشت 1393, 10:47 صبح
شما نمیتونید مستقیم اونا رو باز کنین چون در اصل یه ارایه از بایت هست که تو فایل exe قرار داره و وقتی بهشون دسترسی پیدا میکنین درواقع همون ارایه رو بهتون برمیگردونه ولی میتونین اونا رو روی هارد بنویسین و اجرا کنین یعنی تو یه فلدر temp برای مثال تو appdata توی پوشه ی local معمولا میریزن (یه فلدر به اسم برنامه درست میکنن):لبخند:
از WriteAllBytes استفاده کنین
http://msdn.microsoft.com/en-us/library/system.io.file.writeallbytes(v=vs.110).aspx?cs-save-lang=1&cs-lang=vb#code-snippet-1


ممنون از توضیح شما دوست عزیز
ولی مشکل من بازکردنشون نیست. من می تونم هر کدوم رو بخوام مستقل باز کنم و نمایش بدم. یعنی تو کد اسم مستقیم بیارم. اینجوری:

Private Sub ShowPdf()
Dim byt() As Byte = My.Resources.FileName
Dim path = "c:\Temp.pdf"
IO.File.WriteAllBytes(path, byt)
PdfDocument.FilePath = path
PdfPageView.Show()
End Sub

مشکل من اینه:
من فایل های داخل ریسورس رو بصورت دستی لیست کردم. (نام فایل ها )
حالا می خوام فایلی که نمایس داده میشه از لیست انتخاب بشه. به عبارتی سابروتین بالا ورودی بپذیره.اینجوری
Private Sub ShowPdf (نام یا ایندکس فایل)

aliagamon
شنبه 27 اردیبهشت 1393, 11:49 صبح
اگه منظورتونو درست فهمیده باشم اینو تو رویداد selectedIndexChanged بنویسین جای ارایه بایت جای name هم اسم ایتم لیستباکس میشه
DirectCast(Properties.Resources.ResourceManager.Ge tObject("AWTT"), Byte())

xminxmin
شنبه 27 اردیبهشت 1393, 16:06 عصر
اگه منظورتونو درست فهمیده باشم اینو تو رویداد selectedIndexChanged بنویسین جای ارایه بایت جای name هم اسم ایتم لیستباکس میشه
DirectCast(Properties.Resources.ResourceManager.Ge tObject("AWTT"), Byte())

میشه توی یه قطعه کد کامل بنویسید کدتون رو. رو این ارور میده.

aliagamon
شنبه 27 اردیبهشت 1393, 16:24 عصر
اشتباه از من بود ببخشید من کدی که مربوط به دسترسی به Resources میشه رو تحت سی شارپ نوشتم (چون بدون کامپایلره از رو عادت حای my نوشتم properties :لبخند:
Dim b As Byte() = DirectCast(My.Resources.ResourceManager.GetObject( ListBox1.SelectedItem), Byte())
IO.File.WriteAllBytes("C:\Users\Ali\Downloads\s.pdf", b)

xminxmin
یک شنبه 28 اردیبهشت 1393, 08:47 صبح
اشتباه از من بود ببخشید من کدی که مربوط به دسترسی به Resources میشه رو تحت سی شارپ نوشتم (چون بدون کامپایلره از رو عادت حای my نوشتم properties :لبخند:
Dim b As Byte() = DirectCast(My.Resources.ResourceManager.GetObject( ListBox1.SelectedItem), Byte())
IO.File.WriteAllBytes("C:\Users\Ali\Downloads\s.pdf", b)




توی این کد که گفتید b مقدار نمی گیره (b=Nothing)
کد من:

Private Sub lvList_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lvList.SelectedIndexChanged
Dim path = "c:\sss.pdf"
Dim b As Byte() = DirectCast(My.Resources.ResourceManager.GetObject( lvList.SelectedItems(0).ToString), Byte())
IO.File.WriteAllBytes(path, b)
PdfDocument1.FilePath = Path
PdfPageView1.Show()
End Sub

aliagamon
یک شنبه 28 اردیبهشت 1393, 10:14 صبح
من الان تو کامپایلر هم تست کردم درست بود فایلو ساخت مشکل از شماست احتمالا اسم فایل هارو اشتباه نوشتین و یا پسوند گذاشتین ممکنه پسوند .pdf گذاشته باشین یا اینکه اسم هارو از نظر بزرگی و کوچکی حروف اشتباه نوشتین :لبخند: الان برای تست اسم یکی رو دقیقا کپی کنین به لیست اضافه کنین میبینین که درست کار میکنه (پسوند نزارین)

xminxmin
یک شنبه 28 اردیبهشت 1393, 10:45 صبح
باور کنید اینایی رو اشاره کردید رعایت کردم.
نام فایل اصلی: aaa.pdf
نام فایل در ریسورس: aaa
متن آیتم در لیست ویوو: aaa
قطعه کد اجرای تغییر ایندکس ListView هم همون بالایی هست
نتیجه: b=Nothings
متن خطا در اجرا:
Value cannot be null.
Parameter name: bytes

aliagamon
یک شنبه 28 اردیبهشت 1393, 11:24 صبح
خب زود تر بگین .... من تمام مدت فکر میکردم لیست باکس استفاده کردین برای ویو باید .text هم بنویسین :لبخند:
Dim b As Byte() = DirectCast(My.Resources.ResourceManager.GetObject( ListView1.SelectedItems(0).Text), Byte())

xminxmin
دوشنبه 29 اردیبهشت 1393, 09:42 صبح
[QUOTE=aliagamon;2024740]خب زود تر بگین .... من تمام مدت فکر میکردم لیست باکس استفاده کردین برای ویو باید .text هم بنویسین

:لبخند: عجب سوتی ای دادما. باید خودم متوجه می شدم!!!
:عصبانی++: مشکل بعدی: روی فایل هایی که توی نامشون Space یا کاراکنرهای مجاز مثل (- %) داره جواب نمی ده

aliagamon
دوشنبه 29 اردیبهشت 1393, 10:34 صبح
اینا کلا توسط کامپایلر غیر مجاز شناخته میشه شما میتونین بجای - از _ استفاده کنین و Space هارو هم به _ تبدیل کنین :لبخند:
اگه واجبه که تو لیست اینها وجود داشته باشه میتونی تو ریسورس ها جایگزین براشوون بزارین یعنی مثلا همه رو _ بزارین (یا کلا حذف کنین)و این خط هم قبل از دستور فراخونی بزارین که این علائم رو عوض کنه یا کلا پاک کنه
Dim tempstr As String = ListView1.SelectedItems(0).Text.Replace("-", String.Empty)
Dim b As Byte() = DirectCast(My.Resources.ResourceManager.GetObject( tempstr), Byte())

xminxmin
دوشنبه 29 اردیبهشت 1393, 10:46 صبح
منظور شما اینه که
1- فایل های اصلی رو همه تغییر نام بدم. (مثلا بجای Space بزارم _ )
2- موقع فراخوانی از کد جایگزینی استفاده کنم

منم می خواستم همین کارو کنم ولی فایل ها زیادن. 500 تا حدودا
تغییر نام همشون سخته. گفتم شاید راهی وجود داشته باشه.
راه ابتکاری ای ندارین؟

aliagamon
دوشنبه 29 اردیبهشت 1393, 10:56 صبح
اول همه ی ریسورس هارو بریزیم تو یه پوشه و بعد یه برنامه بنویسین که همه ی فایل هارو تغییر نام بده و در یه فلدر دیگه ذخیره کنه (یعنی کاراکتر های غیر مجاز رو حذف کنه و بعد فایل رو با اسم جدید یه جا ذخیره کنه) حالا اون فایل های جدید رو به ریسورس اضافه کنین (این راهیه که من بودم انجام میدادم واسه فایل های زیاد ممکنه راه دیگه ای هم وجود داشته باشه)....
اگه مشکلی تو برنامه ی بالا داشتین بگین ...:لبخند:

xminxmin
دوشنبه 29 اردیبهشت 1393, 11:07 صبح
:قهقهه: دقیقا در حال نوشتن همون کد بالا بودم که مطلب شما رو خوندم !