2009-09-30 16 views
63

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

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 
} 

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

+3

आपको कोशिश करें कि आखिरकार 'बंद' वास्तव में कॉल किया गया है, यह सुनिश्चित करने के लिए, शेष कोड को अंत में शामिल करने के लिए आपको अंतिम रूप से 'fs.Close()' रखना चाहिए। – Joren

उत्तर

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

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

+0

क्या यह फ़ाइल लॉक का कारण बनता है? –

+0

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

+2

नहीं, ऐसा नहीं होगा - जैसे ही बाइट सरणी पॉप्युलेट हो जाती है, फ़ाइल बंद हो जाती है। –

3

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

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

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

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

या ...

+0

' var' (केवल मेरे कारण बताते हुए) के हास्यास्पद उपयोग के लिए डाउनवॉटेड। –

+0

चलो। वैसे भी, अगर आप इसे बेहतर महसूस करते हैं तो मैं इसे बदल दूंगा। –

+9

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

2

दूसरों उल्लेख किया है कि आप उपयोग कर सकते हैं में निर्मित File.ReadAllBytes। निर्मित विधि ठीक है, लेकिन यह ध्यान देने योग्य है कि कोड आप ऊपर पोस्ट दो कारणों के लिए नाजुक है लायक है:

  1. StreamIDisposable है - आप एक खंड का उपयोग करने में FileStream fs = new FileStream(filename, FileMode.Open,FileAccess.Read) प्रारंभ जगह फ़ाइल सुनिश्चित करने के लिए करना चाहिए बंद कर दिया है । ऐसा करने में विफलता का अर्थ यह हो सकता है कि अगर विफलता होती है तो स्ट्रीम खुलती रहती है, जिसका अर्थ यह होगा कि फ़ाइल लॉक रहती है - और इससे बाद में अन्य समस्याएं हो सकती हैं।
  2. fs.Read आपके अनुरोध से कम बाइट पढ़ सकता है। आम तौर पर, .ReadStream उदाहरण की विधि कम से कम एक बाइट पढ़ेगी, लेकिन जरूरी नहीं कि आप सभी बाइट्स मांगें। आपको एक लूप लिखना होगा जो तब तक पढ़ता है जब तक कि सभी बाइट्स पढ़े न जाएं। This page इसे और अधिक विस्तार से बताता है।
9

दोहराना नहीं करने के लिए क्या हर किसी को पहले ही कहा है, लेकिन फ़ाइल जोड़तोड़ के लिए निम्नलिखित की नकल पुस्तिकाओं handly रखें:

  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);
1

इन सभी उत्तरों को .ReadAllBytes() के साथ उत्तर दें।एक और, इसी तरह (मैं डुप्लिकेट कहना नहीं होगा, क्योंकि वे अपने कोड refactor करने के लिए कोशिश कर रहे थे) सवाल तो यहाँ पर कहा गया था: Best way to read a large file into a byte array in 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 = new File.OpenRead(fileName)) 
    { 
     var binaryReader = new BinaryReader(fs); 
     fileData = binaryReader.ReadBytes((int)fs.Length); 
    } 
    return fileData; 
} 

लेकिन वह सिर्फ मुझे है ...

बेशक, यह सब मानते हैं कि byte[] को पढ़ने के बाद आपके पास मेमोरी है, और मैंने File.Exists में यह सुनिश्चित करने के लिए जांच नहीं की है कि फ़ाइल आगे बढ़ने से पहले है।

संबंधित मुद्दे