c# আমি কিভাবে একটি#একটি ফাইল একটি স্ট্রিম সংরক্ষণ করবেন?



.net stream (8)

বাইনারি ফাইলগুলির জন্য আপনি StreamReader ব্যবহার করতে হবে না (যেমন gifs বা jpgs)। StreamReader টেক্সট তথ্য জন্য। আপনি ইচ্ছাকৃত বাইনারি তথ্য জন্য এটি ব্যবহার করে আপনি প্রায় নিশ্চিতভাবে তথ্য হারাবেন। (যদি আপনি এনকোডিং। গেট এনকোডিং (28591) ব্যবহার করেন তবে সম্ভবত আপনি ঠিক হয়ে যাবেন, কিন্তু বিন্দু কী?)

কেন আপনি একটি StreamReader ব্যবহার করতে হবে? কেন বাইনারি তথ্য হিসাবে বাইনারি তথ্য রাখা এবং বাইনারি তথ্য হিসাবে এটি আবার ডিস্ক (বা এসকিউএল) লিখুন?

সম্পাদনা করুন: এটি এমন কিছু মনে হচ্ছে যা লোকেরা দেখতে চায় ... যদি আপনি কেবলমাত্র একটি স্ট্রীমটিকে অন্যটিতে অনুলিপি করতে চান (উদাহরণস্বরূপ একটি ফাইলটিতে) এটির মতো কিছু ব্যবহার করুন:

/// <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);
    }    
}

একটি প্রবাহে একটি স্ট্রিম ডাম্প করার জন্য এটি ব্যবহার করতে, উদাহরণস্বরূপ:

using (Stream file = File.Create(filename))
{
    CopyStream(input, file);
}

নোট 4 এ Stream.CopyTo চালু করা হয়েছে তা নোট করুন, মূলত একই উদ্দেশ্যে পরিবেশন করা।

আমার একটি স্ট্রীম StreamReader বস্তু আছে যা আমি স্ট্রিম দিয়ে শুরু করেছি, এখন আমি এই স্ট্রীমটি ডিস্কে সংরক্ষণ করতে চাই (স্ট্রিমটি .gif বা .jpg বা .pdf ) হতে পারে।

বিদ্যমান কোড:

StreamReader sr = new StreamReader(myOtherObject.InputStream);
  1. আমি এই ডিস্কে সংরক্ষণ করতে হবে (আমার ফাইল নাম আছে)।
  2. ভবিষ্যতে আমি SQL সার্ভারে এটি সংরক্ষণ করতে চাই।

আমি এনকোডিং টাইপও আছে, আমি যদি এটি SQL সার্ভারে সংরক্ষণ করি, তাহলে আমার কি দরকার?


Answer #1
//If you don't have .Net 4.0  :)

public void SaveStreamToFile(Stream stream, string filename)
{  
   using(Stream destination = File.Create(filename))
      Write(stream, destination);
}

//Typically I implement this Write method as a Stream extension method. 
//The framework handles buffering.

public void Write(Stream from, Stream to)
{
   for(int a = from.ReadByte(); a != -1; a = from.ReadByte())
      to.WriteByte( (byte) a );
}

/*
Note, StreamReader is an IEnumerable<Char> while Stream is an IEnumbable<byte>.
The distinction is significant such as in multiple byte character encodings 
like Unicode used in .Net where Char is one or more bytes (byte[n]). Also, the
resulting translation from IEnumerable<byte> to IEnumerable<Char> can loose bytes
or insert them (for example, "\n" vs. "\r\n") depending on the StreamReader instance
CurrentEncoding.
*/

Answer #2

আরেকটি বিকল্প একটি byte[] স্ট্রিম পেতে byte[] এবং File.WriteAllBytes ব্যবহার করা File.WriteAllBytes । এটা করা উচিত:

using (var stream = new MemoryStream())
{
    input.CopyTo(stream);
    File.WriteAllBytes(file, stream.ToArray());
}

একটি এক্সটেনশান পদ্ধতিতে এটি মোড়ানো এটি আরও নামকরণ দেয়:

public void WriteTo(this Stream input, string file)
{
    //your fav write method:

    using (var stream = File.Create(file))
    {
        input.CopyTo(stream);
    }

    //or

    using (var stream = new MemoryStream())
    {
        input.CopyTo(stream);
        File.WriteAllBytes(file, stream.ToArray());
    }

    //whatever that fits.
}

Answer #3

আমি CopyTo ব্যবহার করে উত্তরগুলি 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 বাইট অ্যারে ব্যবহার করে এবং বাইটগুলি পড়ার পরিবর্তে স্ট্রীম করতে দেয় এক. ফলস্বরূপ, এটি এই ভাবে এটি ধীর হতে পারে। তবে FileStream .Write() পদ্ধতিটি বাইটগুলি লেখার ক্ষেত্রে FileStream করা উচিত নয়, এবং এটি শুধুমাত্র একবারে এটি একটি বাইট করছে, তাই এটি মেমরি বন্ধ করবে না, কেবলমাত্র আপনার কাছে পর্যাপ্ত মেমরি থাকা দরকার একটি byte[] বস্তুর হিসাবে স্ট্রিম রাখা । আমার পরিস্থিতি যেখানে আমি এটি ব্যবহার OracleBlob , OracleBlob , আমাকে একটি byte[] যেতে হয়েছিল byte[] , এটি যথেষ্ট ছোট ছিল, এবং ছাড়াও, আমার কাছে কোন স্ট্রিমিং পাওয়া যায় নি, তাই আমি আমার বাইটগুলি আমার ফাংশনে পাঠিয়েছি, উপরে।

স্ট্রিম ব্যবহার করে অন্য একটি বিকল্পটি জন CopyStream ফাংশনটি এটি অন্য কোন পোস্টে ব্যবহার করতে হবে - এটি কেবলমাত্র ইনপুট স্ট্রীমের জন্য FileStream ব্যবহার করে সরাসরি ফাইলটি তৈরি করে। এটি File.Create ব্যবহার করে না, যেমনটি তিনি করেছিলেন (যা প্রাথমিকভাবে আমার জন্য সমস্যাযুক্ত বলে মনে হয়েছিল, তবে পরবর্তীতে এটি কেবলমাত্র একটি VS বাগ মনে হয় ...)।

/// <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();
}

Answer #4
public void testdownload(stream input)
{
    byte[] buffer = new byte[16345];
    using (FileStream fs = new FileStream(this.FullLocalFilePath,
                        FileMode.Create, FileAccess.Write, FileShare.None))
    {
        int read;
        while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
        {
             fs.Write(buffer, 0, read);
        }
    }
}

Answer #5
private void SaveFileStream(String path, Stream stream)
{
    var fileStream = new FileStream(path, FileMode.Create, FileAccess.Write);
    stream.CopyTo(fileStream);
    fileStream.Dispose();
}

Answer #6

কেন একটি FileStream বস্তু ব্যবহার করবেন না?

public void SaveStreamToFile(string fileFullPath, Stream stream)
{
    if (stream.Length == 0) return;

    // Create a FileStream object to write a stream to a file
    using (FileStream fileStream = System.IO.File.Create(fileFullPath, (int)stream.Length))
    {
        // Fill the bytes[] array with the stream data
        byte[] bytesInStream = new byte[stream.Length];
        stream.Read(bytesInStream, 0, (int)bytesInStream.Length);

        // Use FileStream object to write to the specified file
        fileStream.Write(bytesInStream, 0, bytesInStream.Length);
     }
}

Answer #7

Jon Skeet এর উত্তরে তিলেন্ডর দ্বারা হাইলাইট হিসাবে, স্ট্রিমগুলির একটি .NET 4 থেকে একটি CopyTo পদ্ধতি রয়েছে।

var fileStream = File.Create("C:\\Path\\To\\File");
myOtherObject.InputStream.Seek(0, SeekOrigin.Begin);
myOtherObject.InputStream.CopyTo(fileStream);
fileStream.Close();

অথবা using সিনট্যাক্স সঙ্গে:

using (var fileStream = File.Create("C:\\Path\\To\\File"))
{
    myOtherObject.InputStream.Seek(0, SeekOrigin.Begin);
    myOtherObject.InputStream.CopyTo(fileStream);
}




stream