2008-12-19 12 views
264

मैं एक फ़ाइल में एक पूर्ण फ़ाइल का प्रतिनिधित्व करने वाले Byte[] सरणी लिखने की कोशिश कर रहा हूं।क्या एक बाइट [] ऐरे को सी # में एक फ़ाइल में लिखा जा सकता है?

क्लाइंट से मूल फ़ाइल टीसीपी के माध्यम से भेजी जाती है और फिर सर्वर द्वारा प्राप्त की जाती है। प्राप्त स्ट्रीम को बाइट सरणी में पढ़ा जाता है और फिर इस वर्ग द्वारा संसाधित किया जाता है।

यह मुख्य रूप से यह सुनिश्चित करने के लिए है कि TCPClient प्राप्त करने के लिए अगली स्ट्रीम के लिए तैयार है और प्रसंस्करण अंत से प्राप्त अंत को अलग करें।

FileStream कक्षा एक बाइट सरणी को तर्क या अन्य स्ट्रीम ऑब्जेक्ट के रूप में नहीं लेती है (जो आपको बाइट्स लिखने की अनुमति देती है)।

मैं मूल से एक अलग थ्रेड (टीसीपी क्लाइंट के साथ एक) द्वारा प्रसंस्करण प्राप्त करने का लक्ष्य रख रहा हूं।

मुझे नहीं पता कि इसे कैसे कार्यान्वित किया जाए, मुझे क्या प्रयास करना चाहिए?

उत्तर

586

सवाल का पहला वाक्य के आधार पर: "। मैं लिखने के लिए कोशिश कर रहा हूँ एक बाइट [] सरणी एक फाइल करने के लिए एक पूरी फाइल का प्रतिनिधित्व"

कम से कम प्रतिरोध का रास्ता होगा:

File.WriteAllBytes(string path, byte[] bytes) 

यहाँ प्रलेखित:

System.IO.File.WriteAllBytes - MSDN

5

हाँ, क्यों नहीं?

fs.Write(myByteArray, 0, myByteArray.Length); 
33

आप एक BinaryWriter वस्तु का उपयोग कर सकते हैं।

protected bool SaveData(string FileName, byte[] Data) 
{ 
    BinaryWriter Writer = null; 
    string Name = @"C:\temp\yourfile.name"; 

    try 
    { 
     // Create a new stream to write to the file 
     Writer = new BinaryWriter(File.OpenWrite(Name)); 

     // Writer raw data     
     Writer.Write(Data); 
     Writer.Flush(); 
     Writer.Close(); 
    } 
    catch 
    { 
     //... 
     return false; 
    } 

    return true; 
} 

संपादित करें: ओह, भूल गया finally हिस्सा ... की सुविधा देता है कहते हैं कि यह पाठक ;-) के लिए एक व्यायाम के रूप में छोड़ दिया जाता है

+0

कहना चलें, मैं संकुचित डेटा प्राप्त हुआ है, और मैं [] बाइट के लिए यह decompressed है। क्या उपर्युक्त फ़ंक्शन का उपयोग करके फ़ाइल को वापस बनाना संभव है? कोई ट्यूटोरियल या डेमो ऑनलाइन? – Cannon

+0

@buffer_overflow: यदि आप मूल फ़ाइल को वापस प्राप्त करना चाहते हैं तो आपको इसे पहले संपीड़ित करने की आवश्यकता होगी।संभावित कार्यान्वयन के लिए सजावटी पैटर्न पर नज़र डालें: http://en.wikipedia.org/wiki/Decorator_pattern – Treb

+0

गॉच या। धन्यवाद। – Cannon

9

आप System.IO.BinaryWriter जो एक स्ट्रीम का समय लगता है का उपयोग कर ऐसा कर सकते हैं:

var bw = new BinaryWriter(File.Open("path",FileMode.OpenOrCreate); 
bw.Write(byteArray); 
+6

बस लिखना चाहते हैं, लिखने के बाद bw.flush और bw.close – dekdev

+4

@dekdev: 'बंद()' के रूप में 'बंद() 'से पहले' फ्लश()' को कॉल करने में कोई बात नहीं है क्योंकि 'बंद करें)' फ्लश होगा। 'उपयोग' खंड का उपयोग करना भी बेहतर है जो फ्लश नहीं करेगा। – Tomas

+0

निपटान का उपयोग करने के लिए मत भूलना; –

15

वहाँ एक स्थिर विधि System.IO.File.WriteAllBytes

8

आपका उपयोग कर सकते है इसे लिखने के लिएविधि।

यदि आपका सरणी नाम "myArray" कोड होगा।

myStream.Write(myArray, 0, myArray.count); 
-2
public ActionResult Document(int id) 
    { 
     var obj = new CEATLMSEntities().LeaveDocuments.Where(c => c.Id == id).FirstOrDefault(); 
     string[] stringParts = obj.FName.Split(new char[] { '.' }); 
     string strType = stringParts[1]; 
     Response.Clear(); 
     Response.ClearContent(); 
     Response.ClearHeaders(); 
     Response.AddHeader("content-disposition", "attachment; filename=" + obj.FName); 
     var asciiCode = System.Text.Encoding.ASCII.GetString(obj.Document); 
     var datas = Convert.FromBase64String(asciiCode.Substring(asciiCode.IndexOf(',') + 1)); 
     //Set the content type as file extension type 
     Response.ContentType = strType; 
     //Write the file content 
     this.Response.BinaryWrite(datas); 
     this.Response.End(); 
     return new FileStreamResult(Response.OutputStream, obj.FType); 
    } 
+0

कृपया कोड स्निपेट में थोड़ा सा स्पष्टीकरण जोड़ने पर विचार करें :-) – kleopatra

+0

आप इसमें कुछ विवरण जोड़कर उत्तर में सुधार कर सकते हैं। – Alexey

+0

यह एक एएसपी.Net स्निपेट की तरह दिखता है? अनुमोदित यह पाठ को बाइट सरणी में परिवर्तित करता है और फिर इसे स्ट्रीम में लिखता है। वास्तव में मेरे मूल प्रश्न का जवाब नहीं देता है। –

0

BinaryReader का प्रयास करें:

/// <summary> 
/// Convert the Binary AnyFile to Byte[] format 
/// </summary> 
/// <param name="image"></param> 
/// <returns></returns> 
public static byte[] ConvertANYFileToBytes(HttpPostedFileBase image) 
{ 
    byte[] imageBytes = null; 
    BinaryReader reader = new BinaryReader(image.InputStream); 
    imageBytes = reader.ReadBytes((int)image.ContentLength); 
    return imageBytes; 
} 
संबंधित मुद्दे