फ़ाइल को बाइट में बदलने का विश्वसनीय तरीका []


84

मुझे वेब पर निम्न कोड मिला:

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
}

क्या किसी फ़ाइल को बाइट में बदलने के लिए उपयोग करना विश्वसनीय है [] c # में, या ऐसा करने का एक बेहतर तरीका है?


3
आपको fs.Close()कोशिश-अंत में दिए गए बयान के अंत में भाग देना चाहिए जो बाकी कोड को जोड़ता Closeहै , यह सुनिश्चित करने के लिए कि वास्तव में कहा जाता है।
— जोरन

जवाबों:


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

यह ट्रिक काम आना चाहिए। ReadAllBytes फ़ाइल को खोलता है, इसकी सामग्री को एक नई बाइट सरणी में पढ़ता है, फिर इसे बंद कर देता है। यहाँ उस विधि के लिए MSDN पृष्ठ है ।


क्या यह फ़ाइल लॉक का कारण होगा?
— जेएल

मेरा मतलब है - एक बार बाइट [] आबाद है, क्या फाइल अभी भी लॉक नहीं होगी?
— जेएल

3
नहीं, यह नहीं होगा - बाइट सरणी पॉपुलेटेड होते ही फाइल बंद हो जाती है।
— एरिक फोर्ब्स

4
इसके साथ केवल छोटी सी समस्या है, यदि आपके पास एक बड़ी फ़ाइल (500 एमबी या 1 जीबी, आदि) है तो यह आपके बाइट सरणी के लिए बहुत अधिक मेमोरी आवंटित करेगा। तो कभी-कभी यह एक .Read (..) के चारों ओर लूप देता है और इसे धीरे-धीरे बाहर निकालता है बेशक, यह सब आपके फ़ाइल आकार पर निर्भर करता है। :)
— जोशुआ

3
इस फ़ाइल में अन्य प्रक्रिया द्वारा खोला जाता है, ओ पी विधि के अलावा के साथ काम करेंगे असफल हो जायेगी FileShare.ReadWriteके बादFile.Read
— Motes

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

या ...

var bytes = File.ReadAllBytes(filename) 

13
गंभीरता से? 'var' इस मामले में पूरी तरह से स्वीकार्य है - वापसी का प्रकार स्पष्ट रूप से विधि के नाम पर बताया गया है ...
— Erik Forbes

4
मूल रूप से उपयोग करने के लिए +1 var। यह मेरी निजी राय है (और कई लोगों की), कि इसका यथासंभव उपयोग किया जाना चाहिए। :) इस साइट पर इस मामले पर पहले भी कई बार चर्चा हो चुकी है।
— Noldorin

8
इसके अलावा +1 का उपयोग करने के लिए var ... @silky, मुझे लगता है कि हर कोई इस बारे में एक राय रखने के लिए स्वतंत्र है कि उन्हें पेश किए जाने पर नई भाषा सुविधाओं का उपयोग करना है या नहीं, लेकिन एक उत्तर को अस्वीकार करना क्योंकि यह आपकी राय के अनुरूप नहीं है मुझे लगा कि यह मंच किस बारे में है। यह निश्चित रूप से जेएलएस प्रश्न के साथ बहुत कम है।
— चार्ल्स ब्रेटाना

6
मुझे लगता है कि आपको डाउनवोटिंग करते समय व्यक्तिगत प्राथमिकता से अधिक विचार करना चाहिए। यह पूरी तरह से मान्य उत्तर है, साथ या बिना var। मुझे लगता है कि किसी भी प्रोग्रामर को जिन्हें मैन्युअल रूप से और स्पष्ट रूप से वर्तनी की आवश्यकता होती है, वे बहुत कम स्तर पर काम कर रहे हैं। यह बात नहीं होनी चाहिए कि चर का सटीक प्रकार क्या है, केवल वह चर जो है । यदि यह फ़ाइल से बाइट्स को संग्रहीत करता है, तो यह वही होना चाहिए जो मायने रखता है। नहीं कि यह एक सूची या एक सरणी या MyCustomContainer है।
— jalf

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()। एक और, इसी तरह (मैं डुप्लिकेट नहीं कहूंगा, क्योंकि वे अपने कोड को रीफ़्रैक्टर करने की कोशिश कर रहे थे) सवाल SO पर यहां से पूछा गया था: C # में एक बाइट सरणी में एक बड़ी फाइल पढ़ने का सबसे अच्छा तरीका?

इन पदों में से एक पर एक टिप्पणी की गई थी .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सुनिश्चित करने के लिए जांच नहीं की कि फाइल आगे बढ़ने से पहले है, जैसा कि आप इस कोड को कॉल करने से पहले करेंगे।


1
आपके कोड में एक त्रुटि है, आपको इसे उपयोग करने वाले कथन का उपयोग करने में नए की आवश्यकता नहीं है (FileStream fs = File.OpenRead (fileName)
— जोसर

इतनी अधिक त्रुटि नहीं (मुझे विश्वास है कि कोड अभी भी संकलित होगा) लेकिन मैंने इसे सभी समान हटा दिया। अच्छी पकड़।
— वाप्गुगी

3

एक सामान्य संस्करण के रूप में काफी अच्छा लग रहा है। यदि आप पर्याप्त विशिष्ट हैं, तो आप इसे अपनी आवश्यकताओं को पूरा करने के लिए संशोधित कर सकते हैं।

अपवादों और त्रुटि स्थितियों के लिए भी परीक्षण करें, जैसे फ़ाइल मौजूद नहीं है या पढ़ा नहीं जा सकता है, आदि।

आप कुछ स्थान बचाने के लिए निम्न कार्य भी कर सकते हैं:

 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उदाहरण की विधि कम से कम एक बाइट पढ़ेगी, लेकिन जरूरी नहीं कि सभी बाइट्स आपके लिए पूछें। आपको एक लूप लिखने की आवश्यकता होगी जो सभी बाइट्स को पढ़ने तक रिट्रीट करता है। यह पृष्ठ इसे और अधिक विस्तार से बताता है।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.