फ़ाइल को Base64String में परिवर्तित करना और फिर से वापस करना


108

शीर्षक ही सब कुछ कह देता है:

  1. मैं एक tar.gz संग्रह में ऐसा पढ़ता हूं
  2. फ़ाइल को बाइट्स के एक सरणी में तोड़ दें
  3. उन बाइट्स को बेस 64 स्ट्रिंग में बदलें
  4. उस Base64 स्ट्रिंग को बाइट्स की एक सरणी में बदलें
  5. उन बाइट्स को वापस एक नई tar.gz फ़ाइल में लिखें

मैं पुष्टि कर सकता हूं कि दोनों फाइलें समान आकार की हैं (नीचे दी गई विधि सही है) लेकिन मैं अब कॉपी संस्करण नहीं निकाल सकता।

क्या मैं कुछ भूल रहा हूँ?

Boolean MyMethod(){
    using (StreamReader sr = new StreamReader("C:\...\file.tar.gz")) {
        String AsString = sr.ReadToEnd();
        byte[] AsBytes = new byte[AsString.Length];
        Buffer.BlockCopy(AsString.ToCharArray(), 0, AsBytes, 0, AsBytes.Length);
        String AsBase64String = Convert.ToBase64String(AsBytes);

        byte[] tempBytes = Convert.FromBase64String(AsBase64String);
        File.WriteAllBytes(@"C:\...\file_copy.tar.gz", tempBytes);
    }
    FileInfo orig = new FileInfo("C:\...\file.tar.gz");
    FileInfo copy = new FileInfo("C:\...\file_copy.tar.gz");
    // Confirm that both original and copy file have the same number of bytes
    return (orig.Length) == (copy.Length);
}

संपादित करें: काम करने का उदाहरण बहुत सरल है (@TS के लिए धन्यवाद):

Boolean MyMethod(){
    byte[] AsBytes = File.ReadAllBytes(@"C:\...\file.tar.gz");
    String AsBase64String = Convert.ToBase64String(AsBytes);

    byte[] tempBytes = Convert.FromBase64String(AsBase64String);
    File.WriteAllBytes(@"C:\...\file_copy.tar.gz", tempBytes);

    FileInfo orig = new FileInfo(@"C:\...\file.tar.gz");
    FileInfo copy = new FileInfo(@"C:\...\file_copy.tar.gz");
    // Confirm that both original and copy file have the same number of bytes
    return (orig.Length) == (copy.Length);
}

धन्यवाद!


आप इस तरह एक संपीड़ित फ़ाइल की सामग्री को बदल नहीं सकते। आपको फ़ाइल को चरण 1 में विघटित करना होगा बजाय इसके कि इसे सीधे पढ़ें। और फिर चरण 5 इसी तरह सीधे बाइट्स को सीधे लिखने के बजाय डेटा को फिर से लिखना होगा।
itsme86

सौभाग्य से, चूंकि फ़ाइल का कोई वास्तविक हेरफेर नहीं हुआ था (मूल रूप से बस इसे बिंदु ए से बी तक ले जाने वाले) इस विशेष कार्य को किसी भी (डी /) संपीड़न की आवश्यकता नहीं है
डार्कपबज

जवाबों:


289

यदि आप किसी कारण से अपनी फ़ाइल को बेस -64 स्ट्रिंग में बदलना चाहते हैं। जैसे अगर आप इसे इंटरनेट आदि के माध्यम से पास करना चाहते हैं ... तो आप ऐसा कर सकते हैं

Byte[] bytes = File.ReadAllBytes("path");
String file = Convert.ToBase64String(bytes);

और इसके बाद, फाइल को वापस पढ़ें:

Byte[] bytes = Convert.FromBase64String(b64Str);
File.WriteAllBytes(path, bytes);

जानकारी के लिए थैंक्यू, मैंने नीचे दिए गए उत्तर के साथ जाने की कोशिश की, लेकिन यह मदद नहीं की, लेकिन यह मेरी समस्या को हल करने के लिए लग रहा था एक साधारण
OpenFileDialog

क्या होगा अगर ToBase64String System.OutOfMemoryException रिटर्न करता है? आप बड़ी फ़ाइलों और सीमित मेमोरी के लिए कैसे ऑप्टिमाइज़ करते हैं
Olorunfemi Ajibulu

@OlorunfemiAjibulu तो मुझे संदेह है, आपको धाराओं का उपयोग करने की आवश्यकता होगी। या स्ट्रिंग को भागों में तोड़ दें। एक बार मैंने बड़ी फ़ाइलों के लिए कस्टम एन्क्रिप्शन लिखा था जहाँ हमने एन्क्रिप्टेड चंक्स को बचाया था। हमने चंक आकार के पूर्णांक मान को बचाने के लिए 4 बाइट्स जोड़े। इस तरह हम इतने पदों को पढ़ना जानते थे
टीएस

दिलचस्प @TaylorSpark। मैंने धाराओं का इस्तेमाल किया और मैं ठीक था।
ओलरुनफेमी अजिबुलु

3
private String encodeFileToBase64Binary(File file){    
String encodedfile = null;  
try {  
    FileInputStream fileInputStreamReader = new FileInputStream(file);  
    byte[] bytes = new byte[(int)file.length()];
    fileInputStreamReader.read(bytes);  
    encodedfile = Base64.encodeBase64(bytes).toString();  
} catch (FileNotFoundException e) {  
    // TODO Auto-generated catch block  
    e.printStackTrace();  
} catch (IOException e) {  
    // TODO Auto-generated catch block  
    e.printStackTrace();  
}  
    return encodedfile;  
}

3
हालांकि यह कोड प्रश्न का उत्तर दे सकता है, लेकिन समस्या को हल करने के तरीके के बारे में अतिरिक्त संदर्भ प्रदान करता है और यह समस्या को हल करता है ताकि उत्तर के दीर्घकालिक मूल्य में सुधार हो सके। गुणवत्ता उत्तर प्रदान करने के लिए कृपया यह कैसे पढ़ें - उत्तर दें।
thewaywewere

1
क्यों, फिर से, क्या हमें ज़रूरत है javaअगर ओपी उपयोग करता है c#?
TS

@ क्यों, फिर से, क्या हमें जावा की आवश्यकता है?
Ok
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.