क्या एक बाइट [] ऐरे को C # में एक फाइल पर लिखा जा सकता है?


344

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

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

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

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

मैं मूल (TCPClient के साथ एक) से एक अलग धागा द्वारा प्रसंस्करण प्राप्त करने के लिए लक्ष्य कर रहा हूं।

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

जवाबों:


728

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

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

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

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

System.IO.File.WriteAllBytes - MSDN


40

आप किसी 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भाग को भूल गए ... कहने दें कि यह पाठक के लिए एक अभ्यास के रूप में छोड़ दिया गया है; ;-)


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

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

2
BinaryWriterडिस्पोजेबल है, इसलिए संभवतः एक usingब्लॉक के भीतर उपयोग किया जाना चाहिए । इसका मतलब यह भी होगा कि स्रोत कोड से पता चलता है कि आप कुछ अतिरिक्त कॉल को छोड़ सकते हैं क्योंकि यह डिस्पोज करते समय कुछ सफाई करता है।
जेफ बी


11

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

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

7
बस जोड़ना चाहते हैं, लिखने के बाद bw.flush और bw.close जोड़ें
dekdev

6
@dekdev: बुला का कोई मतलब नहीं है Flush()इससे पहले Close()के रूप में Close()फ्लश होगा। इससे भी बेहतर है कि एक usingक्लॉज का उपयोग किया जाए जो फ्लश'नक्लोज भी होगा।
टॉमस

1
डिस्पोज़ का उपयोग करना न भूलें;
vitor_gaudencio_oliveira



1

बाइनरीरीडर आज़माएं:

/// <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;
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.