কোনও ফাইলকে বাইটে রূপান্তর করার নির্ভরযোগ্য উপায় []


85

আমি ওয়েবে নিম্নলিখিত কোডগুলি পেয়েছি:

private byte [] StreamFile(string filename)
{
   FileStream fs = new FileStream(filename, FileMode.Open,FileAccess.Read);

   // Create a byte array of file stream length
   byte[] ImageData = new byte[fs.Length];

   //Read block of bytes from stream into the byte array
   fs.Read(ImageData,0,System.Convert.ToInt32(fs.Length));

   //Close the File Stream
   fs.Close();
   return ImageData; //return the byte data
}

কোনও ফাইলকে বাইট [] সি # তে রূপান্তর করার জন্য এটি কি যথেষ্ট নির্ভরযোগ্য বা এটি করার আরও ভাল উপায় আছে?


4
আপনি করা উচিত fs.Close()করে দেখুন-পরিশেষে বিবৃতি যে কোড বাকি encloses এর পরিশেষে-অংশে, তা নিশ্চিত করার জন্য Closeআসলে বলা হয়।
— জোরেেন

উত্তর:


221
byte[] bytes = System.IO.File.ReadAllBytes(filename);

কৌতুক করা উচিত। রিডআলবাইটস ফাইলটি খুলবে, এর সামগ্রীগুলি একটি নতুন বাইট অ্যারেতে পড়বে, তারপরে এটি বন্ধ করে it এই পদ্ধতির জন্য এখানে এমএসডিএন পৃষ্ঠা রয়েছে ।


এটি একটি ফাইল লক কারণ হতে পারে?
— জেএল।

মানে - একবার বাইট [] জনবহুল হয়ে গেলে, ফাইলটি এখনও লক হবে না?
— জেএল।

4
না, এটি হবে না - বাইট অ্যারে পপুলেশন হওয়ার সাথে সাথে ফাইলটি বন্ধ হয়ে যায়।
— এরিক ফোর্বস

4
এটির সাথে কেবলমাত্র ছোটখাটো সমস্যাটি যদি আপনার কাছে একটি বড় ফাইল থাকে (500 এমবি বা 1 জিবি ইত্যাদি বলুন) এটি আপনার বাইট অ্যারের জন্য এত বেশি মেমরি বরাদ্দ করবে। তাই কখনও কখনও এটি একটি। এর কাছাকাছি লুপের অর্থ প্রদান করে (..) পড়ুন এবং আস্তে আস্তে বাইরে নিয়ে যান। অবশ্যই এটি আপনার ফাইলের আকারের উপর নির্ভর করে। :)
— জোশুয়া

4
যদি ফাইলটি অন্য কোনও প্রক্রিয়া দ্বারা খোলা হয় তবে এটি ব্যর্থ হবে, ওপি পদ্ধতিটি FileShare.ReadWriteপরে সংযোজন সহ কাজ করবেFile.Read
— মোটেস

28
byte[] bytes = File.ReadAllBytes(filename) 

বা ...

var bytes = File.ReadAllBytes(filename) 

13
সিরিয়াসলি? 'var' এক্ষেত্রে পুরোপুরি গ্রহণযোগ্য - রিটার্নের
— এরিক ফোর্বস

4
মূলত ব্যবহারের জন্য +1 var। এটি আমার ব্যক্তিগত মতামত (এবং আরও অনেকের মত), এটি যতটা সম্ভব ব্যবহার করা উচিত। :) বিষয়টি আগে এই সাইটে বেশ কয়েকবার আলোচিত হয়েছে।
— নলডোরিন

8
এছাড়াও +1 ব্যবহার করার জন্য ... @ সিল্কি, আমি অনুমান করি যে প্রত্যেকেরই নতুন ভাষার বৈশিষ্ট্যগুলি প্রবর্তনকালে ব্যবহার করা হবে কি না সে সম্পর্কে একটি মতামত থাকতে পারে তবে উত্তরটি হ্রাস করা কারণ এটি আপনার মতামত অনুসারে নয় আমি এই ফোরাম সম্পর্কে কি ভেবেছিলাম। এটি অবশ্যই জেএলএস প্রশ্নের সাথে সামান্যই সম্পর্কযুক্ত।
— চার্লস ব্রেটানা

6
আমি ভাবি যে ডাউনটিভোট করার সময় আপনার ব্যক্তিগত পছন্দের চেয়ে বেশি বিবেচনা করা উচিত। এটি একটি সম্পূর্ণ বৈধ উত্তর, সাথে বা বাইরে var। আমার মনে হয় যে কোনও প্রোগ্রামার যাকে ম্যানুয়ালি এবং স্পষ্টভাবে প্রকারভেদ বানান দরকার তা বিমূর্ততার খুব কম স্তরে কাজ করছে। ভেরিয়েবলের সুনির্দিষ্ট ধরণের কী তা বিবেচনা করা উচিত নয় , কেবল ভেরিয়েবলটি কী । যদি এটি ফাইল থেকে বাইটগুলি সঞ্চয় করে, তবে তা যা গুরুত্বপূর্ণ তা হওয়া উচিত। এটি তালিকা বা একটি অ্যারে বা মাই কাস্টমকন্টেইনার নয়।
— জলফ

8
যদি varপ্রকৃত উত্তরের সাথে যদি কিছুটা প্রাসঙ্গিক হয় তবে এটির ব্যবহার নিয়ে তর্ক করার অর্থটি বোধগম্য হত। তবে এখানে, উত্তরের গুরুত্বপূর্ণ অংশটি সঠিক File.ReadAllBytes(filename)। ফলাফলটি কোনও চলকটিতে কীভাবে এবং কীভাবে সংরক্ষণ করা হয় তা ভেরিয়েবলের নামকরণের মতো, বা এর পরে স্থানটি অপ্রাসঙ্গিক =।
— জলফ

12

প্রত্যেকে ইতিমধ্যে যা বলেছে তার পুনরাবৃত্তি না করে ফাইলের ম্যানিপুলেশনের জন্য নীচে চিট শিটটি হাতের সাথে রাখুন:

  1. System.IO.File.ReadAllBytes(filename);
  2. File.Exists(filename)
  3. Path.Combine(folderName, resOfThePath);
  4. Path.GetFullPath(path); // converts a relative path to absolute one
  5. Path.GetExtension(path);

6

এই সমস্ত উত্তর .ReadAllBytes()। আর একটি, অনুরূপ (আমি সদৃশ বলব না, যেহেতু তারা তাদের কোডটি রিফ্যাক্টর করার চেষ্টা করছিল) তাই এসও-তে প্রশ্ন জিজ্ঞাসা করা হয়েছিল: সি # তে বাইট অ্যারেতে কোনও বৃহত ফাইলটি পড়ার সেরা উপায়?

সম্পর্কিত একটি পোস্টে একটি মন্তব্য করা হয়েছিল .ReadAllBytes():

File.ReadAllBytes throws OutOfMemoryException with big files (tested with 630 MB file 
and it failed) – juanjo.arana Mar 13 '13 at 1:31

আমার কাছে আরও ভাল পদ্ধতির সাথে এরকম কিছু হবে BinaryReader:

public static byte[] FileToByteArray(string fileName)
{
    byte[] fileData = null;

    using (FileStream fs = File.OpenRead(fileName)) 
    { 
        var binaryReader = new BinaryReader(fs); 
        fileData = binaryReader.ReadBytes((int)fs.Length); 
    }
    return fileData;
}

তবে এটাই আমি ...

অবশ্যই, এই সমস্তটি ধরে নেওয়া হয় যে এটি byte[]একবার পড়ার পরে আপনার পরিচালনা করার স্মৃতি রয়েছে এবং File.Existsআপনি এই কোডটি কল করার আগে যে কাজটি করতেন সেভাবে এগিয়ে যাওয়ার আগে ফাইলটি আছে কিনা তা নিশ্চিত করার জন্য আমি চেকটি রাখি নি।


4
আপনার কোডে একটি ত্রুটি রয়েছে, এটি ব্যবহার করা আবশ্যক বিবৃতিতে আপনার নতুন ব্যবহারের দরকার নেই (ফাইল স্ট্রিম fs = File.OpenRead (fileName)
— জোসেআর

এত ত্রুটি নয় (আমি বিশ্বাস করি কোডটি এখনও সংকলন করবে) তবে আমি এটি সমস্ত একইভাবে সরিয়েছি। ভালো বল ধরা.
— vapcguy

3

জেনেরিক সংস্করণ হিসাবে যথেষ্ট ভাল দেখাচ্ছে। আপনার চাহিদা পূরণের জন্য আপনি এটিকে সংশোধন করতে পারেন, যদি তারা যথেষ্ট নির্দিষ্ট থাকে।

এছাড়াও ব্যতিক্রম এবং ত্রুটির শর্তগুলির জন্য পরীক্ষা করে দেখা যায় যেমন ফাইলের অস্তিত্ব নেই বা পড়া যায় না ইত্যাদি etc.

কিছু জায়গা বাঁচাতে আপনি নিম্নলিখিতগুলি করতে পারেন:

 byte[] bytes = System.IO.File.ReadAllBytes(filename);

2

অন্যরা উল্লেখ করেছেন যে আপনি বিল্ট-ইন ব্যবহার করতে পারেন File.ReadAllBytes। অন্তর্নির্মিত পদ্ধতিটি দুর্দান্ত, তবে এটি লক্ষ্য করার মতো যে আপনি উপরে পোস্ট করা কোডটি দুটি কারণে ভঙ্গুর:

  1. Streamহয় IDisposable- আপনার FileStream fs = new FileStream(filename, FileMode.Open,FileAccess.Read)ফাইলটি বন্ধ রয়েছে তা নিশ্চিত করার জন্য আপনার ব্যবহারের একটি ধারাতে সূচনা করা উচিত । এটি করতে ব্যর্থ হওয়ার অর্থ এই হতে পারে যে কোনও ব্যর্থতা দেখা দিলে স্ট্রিমটি উন্মুক্ত থাকে, যার অর্থ ফাইলটি লক থাকে - এবং এটি পরবর্তী সময়ে অন্যান্য সমস্যার কারণ হতে পারে।
  2. fs.Readআপনার অনুরোধের চেয়ে কম বাইট পড়তে পারে। সাধারণভাবে, উদাহরণস্বরূপের .Readপদ্ধতিটি Streamকমপক্ষে একটি বাইট পড়বে তবে অগত্যা আপনি যে সমস্ত বাইট চেয়েছেন তা নয়। আপনাকে একটি লুপ লিখতে হবে যা সমস্ত বাইট না পড়া পর্যন্ত পড়াতে পুনরায় চেষ্টা করে। এই পৃষ্ঠাটি আরও বিশদে এটি ব্যাখ্যা করে।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.