PDA

View Full Version : تبدیل یک فایل به آرایه ای از بایت ها ...



saman_h
دوشنبه 26 تیر 1391, 20:19 عصر
سلام دوستان
من به فایلو میخوام با OpenFileDialog بگیرم و اونو تبدیل به []Byte کنم . بعد میخوام اون رو دوباره به حالت اولیه برگردونم . چطوری باید اینکارو انجام بدم . ممنون میشم راهنماییم کنید و اگه کد گذاشتید واسم توضیحش بدید .
میدونم باید از یه همچین دستوری واسه کانورت کردن استفاده کنم : byte[] fileNameLen = BitConverter.GetBytes(fileNameByte.Length); اما این به تنهایی کافی نیست . یکم گیج شدم .
یا شایدم باید اونو Stream کنم ... اما بازم نمیدونم چطوری
ممنون میشم راهنماییم کنید ، خواهشا کدهارو کامل توضیح بدید چون خوش ندارم کپی پیست کنم . باید بفهمم چی به چیه چون ممکنه وسط کار بخوام دسکاریشم بکنم
با تشکر

tooraj_azizi_1035
دوشنبه 26 تیر 1391, 20:36 عصر
سلام

متنی:

// Open the file to read from.
string readText = File.ReadAllText(path);
Console.WriteLine(readText);


باینری:

File.ReadAllBytes Method

saman_h
دوشنبه 26 تیر 1391, 21:02 عصر
دوست عزیز شاید اشتباه از من بوده درست ذکر نکردم . فایل من متنی نیست هرچیزی ممکنه باشه واسه همین میخوام به بایت تبدیلش کنم . بعدش هم که گفتم میخوام دوباره اون رو به حالت اولیه برگردونم .
ممنون میشم راهنمایی کنید یا نمونه کد واسم بذارید .

tooraj_azizi_1035
دوشنبه 26 تیر 1391, 21:16 عصر
پس همون File.ReadAllBytes رو استفاده کن بلدی که؟
کاری نداره مسیر میگیره یه آرایه از نوع byte[] بر می گردونه.

Saeed_m_Farid
دوشنبه 26 تیر 1391, 21:18 عصر
از MSDN بدون نیاز به تلاش و گیج شدن: FileStream.Read Method (http://msdn.microsoft.com/en-us/library/system.io.filestream.read.aspx)
یه مثال ته‌اش هست، هر دوتا حالت هم با توضیحات کامل ذکر شده؛ چرا کپی پیست؟ اونهمه توضیح میده، کجاش رو نمی‌فهمین؟


فایل (همون که میخوای با OpenFileDialog بگیری) با خاصیت Read باز میشه -> یک بافر تعریف میشه -> تا زمانیکه بایتی برای خوندن هست می‌خونه -> خوندن تمام
برای "دوباره به حالت اولیه" -> از همون بافر که خونده شده می‌ریزه در یک FileStream جدید که فایل رو برای Write باز کرده -> اتمام هلو+برو تو گلو

saman_h
دوشنبه 26 تیر 1391, 21:40 عصر
پس همون File.ReadAllBytes رو استفاده کن بلدی که؟
کاری نداره مسیر میگیره یه آرایه از نوع byte[] بر می گردونه.


نه بلد نیستم ... :گریه: ممنون میشم اگه بیشتر راهنمایی کنید یا در صورت امکان تیکه کد واسم بذارید و توضیحش بدید

saman_h
دوشنبه 26 تیر 1391, 21:41 عصر
از MSDN بدون نیاز به تلاش و گیج شدن: FileStream.Read Method (http://msdn.microsoft.com/en-us/library/system.io.filestream.read.aspx)
یه مثال ته‌اش هست، هر دوتا حالت هم با توضیحات کامل ذکر شده؛ چرا کپی پیست؟ اونهمه توضیح میده، کجاش رو نمی‌فهمین؟


فایل (همون که میخوای با OpenFileDialog بگیری) با خاصیت Read باز میشه -> یک بافر تعریف میشه -> تا زمانیکه بایتی برای خوندن هست می‌خونه -> خوندن تمام
برای "دوباره به حالت اولیه" -> از همون بافر که خونده شده می‌ریزه در یک FileStream جدید که فایل رو برای Write باز کرده -> اتمام هلو+برو تو گلو


باب شما حرفه ای هستید !!! من مخم هنک کرد اینحوری گفتید که ... !!!

Mahmoud.Afrad
دوشنبه 26 تیر 1391, 21:57 عصر
برای تبدیل به آرایه ای از بایتها
byte[] fileBytes = File.ReadAllBytes("File Path");برای نوشتن در فایل
File.WriteAllBytes("Path", fileBytes);

saman_h
دوشنبه 26 تیر 1391, 23:39 عصر
برای تبدیل به آرایه ای از بایتها
byte[] fileBytes = File.ReadAllBytes("File Path");برای نوشتن در فایل
File.WriteAllBytes("Path", fileBytes);
ممنون دوست عزیز عالی بود . فقط یه نکته و سوال !!! من میخوام اینو داخل شبکه ارسال کنم . حقیقتا اصل کارم اینه که یه فایل رو از طریق شبکه بفرستم ( Socket ) ولی از اونجایی که هرچی سوال میکنم کسی جواب نمیده یا کدهارو توضیح نمیده یا مثال های سخت میذارن مجبور شدم اینطوری سوالمو بپرسم . خوشبختانه کار میکنه اما الام میخوام اون رو داخل شبکه ارسال کنم .
اینطوری فرستادمش : OpenFileDialog o = new OpenFileDialog();
o.ShowDialog();
byte[] fileBytes = new byte[100000];
fileBytes=File.ReadAllBytes(o.FileName);
sock.Send(fileBytes, SocketFlags.None);
و اینطوری داخل سرور گرفتمش :
int counter;
byte[] buff = new byte[100000];
while (true)
{
try
{
connection.Receive(buff, SocketFlags.None);
File.WriteAllBytes(@"d:\r.pdf", buff);
message = Encoding.UTF8.GetString(buff);
for (counter = 0; counter < 100; counter++)
buff[counter] = Convert.ToByte(false);
}
catch (Exception ex)
{}
نکته اینجاس که فایلو کامل نمیگیره !! سایز بافر رو زیاد کردم ( همون آرایه بایت ها ) گفتم شاید جا نشه داخلش اما بازم کامل نیومد !!
ممنون میشم راهنماییم کنید

ASKaffash
سه شنبه 27 تیر 1391, 07:20 صبح
سلام
چرا سوکت ؟ راه آسانتر برای ارسال وجود دارد مثل استفاده از DotNet Remoting و یا WCF بنظر من پیاده سازی سوکت سخت تر از پیاده سازی مثلا WCF است در این حالت شما یک متد برای ارسال FileStream طراحی می کنید و دریافت و ارسال را انجام میدهید

saman_h
چهارشنبه 28 تیر 1391, 20:56 عصر
سلام
چرا سوکت ؟ راه آسانتر برای ارسال وجود دارد مثل استفاده از DotNet Remoting و یا WCF بنظر من پیاده سازی سوکت سخت تر از پیاده سازی مثلا WCF است در این حالت شما یک متد برای ارسال FileStream طراحی می کنید و دریافت و ارسال را انجام میدهید

دوست عزیز من دارم روی یه برنامه کار میکنم که از طریق Socket و پروتکل TCP/IP اطلاعات رو ارسال میکنم . فرض کن نرم افزار چت !! متن به راحتی ارسال میشه اما واسه ارسال فایل مشکل دارم . اون راهی که دوستمون گفت واقعا مفید و در عین حال راحت بود و بسیااااااااااااار مفید . اما مشکلم اینجاس که توی سمت سرور باید حتما متغییری که از نوع بایت هس یه اندازه خاص داشته باشه و وقتی فایل ارسال میشه حالا حجمش هرچقدر بوده به همون اندازه ای که بافر توی سرور تعریف شده بیرون میاد و مشکل دوم اینکه نمیتونم پسوند فایل دریافتی رو تشخیص بدم !!
ممنون میشم اگه کسی میدونه منو راهنمایی کنه
با تشکر

saman_h
پنج شنبه 29 تیر 1391, 13:37 عصر
من هنوز مشکلم با نوع پسوند و اون آرایه ای که باید تعریف کنم حل نشده . دوستان ممنون میشم راهنمایی کنید یا نظرتون رو بگید یا اگه روشی دارید بهم معرفی کنید

sirvan-me
جمعه 30 تیر 1391, 11:38 صبح
چرا به جای استفاده از آرایه از لیست پیوندی و یا لیست استفاده نمی کنی . اینطوری نیاز به تعریف سایز اولیه نیست و می تونی یه آرایه پویا داشته باشی برای تعریف هم می تونی از کد های زیر استفاده کنی :

اگر نبود

using System.Collections.Generic;



List<Byte> Bytes = new List<Byte>();

Ofd.Filter = "All Files | *.*";
if (Ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
Bytes = System.IO.File.ReadAllBytes(Ofd.FileName).ToList() ;
}

و برای تبدیل هم :

System.IO.File.WriteAllBytes(Sfd.FileName, Bytes.ToArray());

تعریف Linked List هم به صورت زیره :

LinkedList<Byte> Link_List = new LinkedList<Byte>();

saman_h
جمعه 30 تیر 1391, 12:03 عصر
از این نوع که تعریف میکنم نمیشه اوی این قسمت قبول نمیکنه : connection.Receive(bytes, SocketFlags.None);

sirvan-me
جمعه 30 تیر 1391, 12:09 عصر
از این نوع که تعریف میکنم نمیشه اوی این قسمت قبول نمیکنه : connection.Receive(bytes, SocketFlags.None);

connection.Receive(bytes.ToArray(), SocketFlags.None);

به این صورت بنویس ببین جواب میده ....

saman_h
جمعه 30 تیر 1391, 12:26 عصر
connection.Receive(bytes.ToArray(), SocketFlags.None);

به این صورت بنویس ببین جواب میده ....

ارور نداد اما حجم فایلی که دریافت میشه 0 بایت هست !! چیکار کنم ؟

sirvan-me
جمعه 30 تیر 1391, 13:55 عصر
این لینک رو ببین ... این دوستمون تو سایت StackoverFlow هم دقیقا مشکل شما رو داره .

Socket File Transfer sending incomplete files in C#‎‎‎ (http://stackoverflow.com/questions/9016793/socket-file-transfer-sending-incomplete-files-in-c-sharp)

این لینک ها هم ببین ... نمونه برنامه هاشو دان کن .

File Transfer using Socket Application in C#‎ .NET 2.0 (http://www.codeproject.com/Articles/24017/File-Transfer-using-Socket-Application-in-C-NET-2)

Send File ( 2 GB! ) Using Socket (http://socketprogramming.blogspot.com/2009/02/transfer-large-file-2gb-using-socket-in.html)

Sending Files Using TCP (http://www.codeproject.com/Articles/32633/Sending-Files-using-TCP)

راستی بهت توصیه می کنم ساختار لایه TCP رو حتما مطالعه کن .

saman_h
جمعه 30 تیر 1391, 15:31 عصر
مرسی
چک میکنم ببینم چی میشه . خبر میدم

saman_h
شنبه 31 تیر 1391, 12:41 عصر
فایده نداشت . کارم راه نسافتاد بازم همونطوره
الان با اندازه فایل مشکل ندارم . فقط با اسم فایل مشکل دارم .
از کلاینت اینو میفرستم :
OpenFileDialog o = new OpenFileDialog();
o.ShowDialog();
byte[] fileBytes ;
fileBytes = File.ReadAllBytes(o.FileName) ;
string h = fileBytes.Length.ToString();
byte[] gg = Encoding.UTF8.GetBytes(h + "~" + o.SafeFileName);
sock.Send(gg, SocketFlags.None);
Thread.Sleep(100);
sock.Send(fileBytes, SocketFlags.None);


بعد توی سرور اینطوری کار میکنم :
این یه تابع رو نوشتم :
public void recive(int size, string FileName)
{
int counter_file;
byte[] buff_file = new byte[size];
try
{
connection.Receive(buff_file, SocketFlags.None);
File.WriteAllBytes(FileName, buff_file);
for (counter_file = 0; counter_file < buff_file.Length; counter_file++)
buff_file[counter_file] = Convert.ToByte(false);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}

Thread.Sleep(1000);

}

بعدش این تایع روی گداشتم اوی یه Thread :
public void WaitForConnect()
{


if (!conected)
{
TcpListener server = new TcpListener(ipAddress, port);
Status = "Listening for Connections on " + hostName + "...\n";
server.Start();
connection = server.AcceptSocket();
Status = "Client are now connected to the server";
conected = true;
}

int counter;
byte[] buff = new byte[100];
while (true)
{
try
{
if (recive_file == false)
{
recive_file = true;
connection.Receive(buff, SocketFlags.None);
txt_beforeSplit = Encoding.UTF8.GetString(buff);
Arr_After_Split = txt_beforeSplit.Split('~');
size = int.Parse(Arr_After_Split[0]);
name = Arr_After_Split[1];

for (counter = 0; counter < buff.Length; counter++)
buff[counter] = Convert.ToByte(false);

}
else
{
recive(size, full_path+name);
recive_file = false;
for (counter = 0; counter < buff.Length; counter++)
buff[counter] = Convert.ToByte(false);
}

catch (Exception ex) { }
Thread.Sleep(1000);
}
}



اما ارور میده میگه مسیرت مشکل داره و دارای کارکتریه که نباید باشه . حالا اگه توی این recive(size, full_path+name); خط بنویسم : بجاش بنویسم : recive(size, @"D:\a.pdf"); درست میشه اما مساله اینجاس اونوقت دیگه نمیتونم اسم فایل و جتی پسوند فایل رو بفهمم که با همون پسوند و نام ذخیرش کنم . از FolderBrowser و ... هم استفاده کردم واسه ذخیره مسیر اما نشد !! به این صورت : private void button1_Click(object sender, EventArgs e)
{
if (folderBrowserDialog1.ShowDialog() == DialogResult.OK)
{
full_path = folderBrowserDialog1.SelectedPath ;
label3.Text = full_path;
}
else
{
full_path = @"D:\";
label3.Text = full_path ;
}
}

اما باز هم ... :گریه:
ممنون میشم راهنماییم کنید