PDA

View Full Version : حرفه ای: تبدیل بایت به فایل هایی که ذخیره شده



ebrahim.rayatparvar
یک شنبه 02 خرداد 1395, 12:20 عصر
سلام دوستان
من در در فروم و گوگل جستجو کردم و به اون جوابی که میخواستم نرسیدم برای همین مجبور به زدن تاپیک تقریبا تکراری شدم.

من با کد زیر فایلی رو تبدیل به باینری کردم و در بانک ذخیره میکنم.

public static byte[] ConvertToBinary(string fileName)
{
byte[] buffer = null;
try
{
// Open file for reading
var fileStream = new FileStream(fileName, FileMode.Open,
FileAccess.Read);
// attach filestream to binary reader
var binaryReader = new BinaryReader(fileStream);
// get total byte length of the file
long totalBytes = new FileInfo(fileName).Length;
// read entire file into buffer
buffer = binaryReader.ReadBytes((Int32) totalBytes);
// close file reader
fileStream.Close();
fileStream.Dispose();
binaryReader.Close();
}
catch (Exception)
{
// ignored
}
return buffer;
}
حالا با این روش من میتونم هر فایلی رو تبدیل به باینری میکنم و در بانک ذخیره میکنم ولی حالا میخوام از بانک بخونم و اجرا کنم ولی از کجا باید بفهمم این فایل چه نوعی هست که تبدیل کنم و اجرا کنم. نکته دیگه این فایل ها امکان داره هر نوعی باشه محدود به Excel,PDF,Word,.. چند آیتم خاص نیست.

با تشکر.

ebrahim.rayatparvar
یک شنبه 02 خرداد 1395, 20:03 عصر
سلام دوباره خدمت دوستان عزیز.
من کد زیر رو پیدا کردم پیاده هم کردم البته پسوند فایل رو همراش ذخیره میکنم تا بعد بفهمم چه فایلی دارم برمیگردونم و اینم کدی که ردم :

var dt = _blCls.BlLoadFile();

byte[] filedata = (byte[])dt.Rows[0]["Data"];
string extension = dt.Rows[0]["ExtentionData"].ToString();

string filename = string.Format("{0}Tara.{1}", Path.GetTempPath(), extension);
FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.ReadWrite);
BinaryWriter bw = new BinaryWriter(fs);
bw.Write(filedata, 0, ((byte[]) dt.Rows[0]["Data"]).Length);
bw.Close();
var process = Process.Start(filename);
process.Exited += (s, e) => File.Delete(filename);
فایل درست میشه ولی اجرا نمیشه وقتی میرم تو پوشه Temp قایل هست ولی پیغام خطا میده موقع اجرا و مثلا عکس بالا میاد ولی نمایش داده نمیشه

ebrahim.rayatparvar
سه شنبه 04 خرداد 1395, 10:57 صبح
این چند روز کلی سایت رو تو گوگل سرچ زدم و خیلی ها رو دوباره میرفتم داخل میدیم تست میکردم ولی هیچ کدوم از کدهایی که پیدا میکردم کار نمیکیرد خیلی ها که اصلا برای کار من نبود. تو انجمن هم قبلا یه جا یادمه در این مورد بحث شد که یکی از دوستان یک کدی داد که بشه اینکار رو کرد ولی سیستم جستجو انجمن فعلا ظاهرا کار نمیکنه از تو گوگل هر چی میزنم خیلی قدیمی میاد که آخر مشخص نشد نتیجه چی شد و چه کدی این وسط زده شده. :گریه:

ژیار رحیمی
سه شنبه 04 خرداد 1395, 23:42 عصر
http://stackoverflow.com/questions/58510/using-net-how-can-you-find-the-mime-type-of-a-file-based-on-the-file-signature

ebrahim.rayatparvar
چهارشنبه 05 خرداد 1395, 09:58 صبح
سلا مهندس جان.
بایت لینکی دادین تشکر فق یه مساله اینجا هست الان من این کدها رو که دارم نگاه میکنم همه اینا دارن رو تشخیص پسوند فایل مانور میدن البته چیزی که من از اینا که دارن اینجا میگن فهمیدم. ولی من مانی که فایل رو میخوام تو بانک ذخیره کنم پسوندش رو هم همراش دخیره میکنم و موقعی که از بانک میخونم فایل رو هم میدونم از چه نوعی هست. تو کدبالا که گذاشتم :


سلام دوباره خدمت دوستان عزیز.
من کد زیر رو پیدا کردم پیاده هم کردم البته پسوند فایل رو همراش ذخیره میکنم تا بعد بفهمم چه فایلی دارم برمیگردونم و اینم کدی که ردم :


1
2
3
4
5
6
7
8
9
10
11
12
13

var dt = _blCls.BlLoadFile();

byte[] filedata = (byte[])dt.Rows[0]["Data"];
string extension = dt.Rows[0]["ExtentionData"].ToString();

string filename = string.Format("{0}Tara.{1}", Path.GetTempPath(), extension);
FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.ReadWrite);
BinaryWriter bw = new BinaryWriter(fs);
bw.Write(filedata, 0, ((byte[]) dt.Rows[0]["Data"]).Length);
bw.Close();
var process = Process.Start(filename);
process.Exited += (s, e) => File.Delete(filename);







فایل درست میشه ولی اجرا نمیشه وقتی میرم تو پوشه Temp قایل هست ولی پیغام خطا میده موقع اجرا و مثلا عکس بالا میاد ولی نمایش داده نمیشه.


در این 3 خط :


var dt = _blCls.BlLoadFile();

byte[] filedata = (byte[])dt.Rows[0]["Data"];
string extension = dt.Rows[0]["ExtentionData"].ToString();




میبینید که مقدار رو از بانک میخونم که 2 ستون داره یکی داده ما هست و دیگری پسوند فایل که متاسفانه طمانی که عملیات رایت رو انجام میدم فایلش تو پوشه Temp ویندوز ساخته میشه ولی زمانی که اجرا میشه چیزی نمایش دادخ نمیشه حالا چه بخواد عکس فایل متنی و....
مثلا عکس جدا خیلی راحته ولی به این صورت هر کار کردم نشد.

ژیار رحیمی
چهارشنبه 05 خرداد 1395, 17:58 عصر
byte[] fileData = ;//آرایه خونده شده از دیتابیس
string extension =;//پسوند فایل
File.WriteAllBytes(@"D:\Temp."+extension, fileData);

ebrahim.rayatparvar
چهارشنبه 05 خرداد 1395, 18:41 عصر
این کد رو هم زدم ولی باز مثل دور قبل همون مشکل مثلا عکس رو ذخیره میکنم ولی زمانی که از بانک میخونم باز میکنم صفحه Windows Photo Viewer نمایش دادخ میشه ولی عکس نمایش داده نمیشه و فایل های دیگه هم به همین صورت. من در جاهای دیگه برای تبدیل عکس به باینری و ذخیره اون تو بانک از کد زیر استفاده کردم :


public static byte[] ImageToByte(Image img) //--------- تبدیل عکس به باینری -------------
{
byte[] byteArray;
using (MemoryStream stream = new MemoryStream())
{
img.Save(stream, ImageFormat.Png);
stream.Close();
byteArray = stream.ToArray();
}
return byteArray;
}


و بایت به عکس از کد زیر :


public static Bitmap BinaryToBitmap(DataTable dt, int i, string j)
{
var ms = new MemoryStream((byte[]) dt.Rows[i][j]);
Bitmap bmpBitmap = new Bitmap(ms);
return bmpBitmap;
}


من تو این بخش مشخص نیست که چه فایلی میخوام رو ذخیره کنم و باز دوباره بخوام بازش کنم و اینجور که مشخصه همه جا کد هایی که رده شده مثل کد مهندس ژیار رحیمی (http://barnamenevis.org/member.php?48557-%DA%98%DB%8C%D8%A7%D8%B1-%D8%B1%D8%AD%DB%8C%D9%85%DB%8C) بوده. الان من نمیدونم اصلا کد تبدیل من برای باینری که به بانک بفرستم درسته؟؟؟؟ کد زیر :


public static byte[] ConvertToBinary(string fileName)
{
byte[] buffer = null;
try
{
// Open file for reading
var fileStream = new FileStream(fileName, FileMode.Open,
FileAccess.Read);
// attach filestream to binary reader
var binaryReader = new BinaryReader(fileStream);
// get total byte length of the file
long totalBytes = new FileInfo(fileName).Length;
// read entire file into buffer
buffer = binaryReader.ReadBytes((Int32) totalBytes);
// close file reader
fileStream.Close();
fileStream.Dispose();
binaryReader.Close();
}
catch (Exception)
{
// ignored
}
return buffer;
}


شاید این کد داره بد تبدیل میکنه که بعد گرفتن مقدار از بانک و بازیابی به مشکل میخوریم.

Mahmoud.Afrad
چهارشنبه 05 خرداد 1395, 19:30 عصر
فایلها فقط عکس هستند یا نه؟

تا اونجایی که من سرچ کردم، Process.Start فقط برای فایلهای exe یک شئ Process برمیگردونه و از اونجایی که شما یک فایل غیراجرایی رو با این متد باز میکنید مقدار null برمیگرداند و به همین دلیل چون شئ ندارید نمیتوانید رویداد Exited را هندل کنید.

و اگر مهم هست که کاربر نتواند از فایل کپی تهیه کند، این عمل شما جوابگو نخواهد بود، چون کاربر توسط نرم افزاری که اجرا میشود میتواند فایل را save as کند.

ebrahim.rayatparvar
چهارشنبه 05 خرداد 1395, 20:02 عصر
کد زیر رو برای اطمینان که شما گفتید زدم :


Process.Start(@"E:\Picture\arm1.jpg");

خیلی راحت اجرا شد و مشکلی هم نداره حتما نباید فایل ما EXE باشه هر فایل اجرایی رو اجرا میکنه. گفتم شاید چون تو درایو C و پوشه Temp جایی که کمتر کسی میدونه کجا الیته منظور کاربرایی که زیاد در مورد کامپیوتر نمیدونن امدم عکس رو بردم اونجا کپی کردم و کد بالا رو به آدرس مربوطه بردم :


Process.Start(@"C:\Users\Ebrahim\AppData\Local\Temp\arm1.jpg");

باز هم اجرا شد. پس مشکلی رو اجرا شدن نداره.این تبدیله ظاهرا مشکل داره هر چی هم میزارم باز همونه

ebrahim.rayatparvar
چهارشنبه 05 خرداد 1395, 20:08 عصر
نمیتوانید رویداد Exited را هندل کنید.

این بخش پست شما رو تازه متجه شده سریع خونده بودم منظور شما رو خوب نفهمیدم. آره زمانی که عکس یا هر فایلی به غیر از EXE اجرا میشه این رویداد پیغام خطا میده که باید یه جوری دورش زد