আমি সমস্ত উত্তর ব্যবহার করে পাই না CopyTo
, যেখানে সম্ভবত অ্যাপ্লিকেশন ব্যবহার করা সিস্টেমগুলি .NET 4.0+ এ আপগ্রেড করা নাও হতে পারে। আমি জানি কিছু লোককে আপগ্রেড করার জন্য জোর করতে চাইবে তবে সামঞ্জস্যতাও খুব সুন্দর।
অন্য একটি জিনিস, আমি প্রথম স্থানে অন্য স্ট্রিম থেকে অনুলিপি করতে একটি স্ট্রিম ব্যবহার করি না। কেন শুধু করবেন না:
byte[] bytes = myOtherObject.InputStream.ToArray();
আপনার একবার বাইটস হয়ে গেলে আপনি সহজেই এগুলিকে একটি ফাইলে লিখতে পারেন:
public static void WriteFile(string fileName, byte[] bytes)
{
string path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
if (!path.EndsWith(@"\")) path += @"\";
if (File.Exists(Path.Combine(path, fileName)))
File.Delete(Path.Combine(path, fileName));
using (FileStream fs = new FileStream(Path.Combine(path, fileName), FileMode.CreateNew, FileAccess.Write))
{
fs.Write(bytes, 0, (int)bytes.Length);
//fs.Close();
}
}
এই কোডটি কোনও .jpg
ফাইলের সাথে এটি পরীক্ষা করার সাথে সাথে কাজ করে , যদিও আমি স্বীকার করি আমি কেবল এটি ছোট ফাইল (1 এমবি এর চেয়ে কম) দিয়ে ব্যবহার করেছি। একটি স্ট্রিম, স্ট্রিমের মধ্যে কোনও অনুলিপি নেই, কোনও এনকোডিং দরকার নেই, কেবল বাইটগুলি লিখুন! StreamReader
আপনার যদি ইতিমধ্যে কোনও স্ট্রিম থাকে তবে আপনি bytes
সরাসরি রূপান্তর করতে পারেন এর সাথে জিনিসগুলিকে অতিরিক্ত জটিল করার দরকার নেই .ToArray()
!
কেবলমাত্র সম্ভাব্য ডাউনসাইডগুলি আমি এটি করতে এটি দেখতে পাচ্ছি যদি আপনার কাছে একটি বড় ফাইল থাকে তবে এটি একটি স্ট্রিম হিসাবে থাকে এবং ব্যবহার .CopyTo()
বা সমতুল্য হলে FileStream
এটি বাইট অ্যারে ব্যবহার না করে এবং বাইটগুলি একে একে পড়ার পরিবর্তে প্রবাহিত করতে দেয় । ফলস্বরূপ এটি এটি এইভাবে করা ধীর হতে পারে। তবে এটি বোকা লেখা উচিত নয় যেহেতু হ্যান্ডলগুলি বাইটগুলি লেখার .Write()
পদ্ধতিটি নয় FileStream
এবং এটি একবারে এটি কেবল একটি বাইট করে চলেছে, সুতরাং এটি স্মৃতি আটকে রাখবে না, কেবল স্ট্রিমটি ধরে রাখতে আপনার যথেষ্ট স্মৃতি থাকতে হবেbyte[]
except বস্তু । আমার যে পরিস্থিতিতে আমি এটি ব্যবহার করেছি OracleBlob
, পেয়েছি, আমাকে একটিতে যেতে byte[]
হয়েছিল, এটি যথেষ্ট ছোট ছিল এবং তদ্ব্যতীত, আমার কাছে কোনও স্ট্রিমিং উপলব্ধ ছিল না, যাইহোক, তাই আমি উপরে আমার ফাংশনে আমার বাইটগুলি প্রেরণ করেছি।
স্ট্রিম ব্যবহার করে অন্য একটি বিকল্প CopyStream
হ'ল এটি হ'ল জন স্কিটের ফাংশন যা এটি অন্য পোস্টে ছিল - এটি কেবল FileStream
ইনপুট স্ট্রিম গ্রহণ করতে এবং সরাসরি ফাইলটি তৈরি করতে ব্যবহার করে। এটি ব্যবহার করে না File.Create
, যেমন সে করেছিল (যা প্রথম দিকে আমার পক্ষে সমস্যাযুক্ত বলে মনে হয়েছিল, তবে পরে পাওয়া গেছে এটি সম্ভবত একটি ভিএস বাগ ছিল ...)।
/// <summary>
/// Copies the contents of input to output. Doesn't close either stream.
/// </summary>
public static void CopyStream(Stream input, Stream output)
{
byte[] buffer = new byte[8 * 1024];
int len;
while ( (len = input.Read(buffer, 0, buffer.Length)) > 0)
{
output.Write(buffer, 0, len);
}
}
public static void WriteFile(string fileName, Stream inputStream)
{
string path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
if (!path.EndsWith(@"\")) path += @"\";
if (File.Exists(Path.Combine(path, fileName)))
File.Delete(Path.Combine(path, fileName));
using (FileStream fs = new FileStream(Path.Combine(path, fileName), FileMode.CreateNew, FileAccess.Write)
{
CopyStream(inputStream, fs);
}
inputStream.Close();
inputStream.Flush();
}