2014-09-18 11 views
5

पढ़ता है मेरे पास एक gzip फ़ाइल है जिसमें एक txt फ़ाइल है जिसे साफ़ करने की आवश्यकता है। मैं लाइन द्वारा GZipped फ़ाइल लाइन से पढ़ने के लिए और उसके बाद सभी एक शॉट इस तरह में एक निर्गम GZIP फाइल करने के लिए साफ सामग्री लिखने चाहते हैं:StreamReader के साथ GZipStream.ReadLine केवल पहली पंक्ति

void ExtractAndFix(string inputPath, string outputPath) { 
     StringBuilder sbLine = new StringBuilder(); 

     using (GZipStream gzInput = new GZipStream(new FileStream(inputPath, FileMode.Open), System.IO.Compression.CompressionMode.Decompress)) { 
      using (StreamReader reader = new StreamReader(gzInput, Encoding.UTF8)) { 
       using (GZipOutputStream gzipWriter = new GZipOutputStream(new FileStream(outputPath, FileMode.Create))) { 
        string line = null; 
        while ((line = reader.ReadLine()) != null) { 
         sbLine.Clear(); 
         sbLine.Append(line.Replace("\t", " ")); 
         sbLine.Append("\r\n"); 
         byte[] bytes = Encoding.UTF8.GetBytes(sbLine.ToString()); 
         gzipWriter.Write(bytes, 0, bytes.Length); 
        } 
       } 
      } 
     } 
    } 

लेकिन कुछ कारण यह है कि लाइन के लिए फोन = reader.ReadLine के लिए () जबकि लूप में केवल एक बार पढ़ता है और फिर शून्य (पाठक ईओएस = सत्य) देता है। मैंने देशी सी # संपीड़न लाइब्रेरी के साथ और आईसीएसएचआरपीओडी पैकेज के साथ दोनों की कोशिश की है और मुझे वही व्यवहार मिलता है। मुझे एहसास है कि मैं हमेशा पूरी फ़ाइल निकाल सकता हूं, फिर इसे साफ़ कर सकता हूं, फिर इसे फिर से संपीड़ित कर सकता हूं, लेकिन मुझे संसाधनों, हार्ड ड्राइव स्पेस इत्यादि को बर्बाद करने से नफरत है। नोट: ये बड़ी फाइलें हैं (कई जीबी संपीड़ित हैं) तो कुछ भी मेमोरीस्ट्रीम के साथ एक अच्छा समाधान नहीं होने वाला है। क्या किसी ने इससे पहले कुछ अजीब सामना किया है? धन्यवाद।

+0

आप सुनिश्चित करें कि फ़ाइल वास्तव में सिर्फ धारा संकुचित है और संग्रह ज़िप नहीं कर रहे हैं के साथ किसी और को मदद मिलती है? –

+2

@ एलेक्सी लेवेनकोव - यदि यह ज़िप था तो यह कभी भी GZip स्ट्रीम बनाने में सक्षम नहीं होगा, यह असफल हो जाएगा क्योंकि फ़ाइल प्रकार गलत होगा – bruiseruser

+0

संभावित डुप्लिकेट [GZipStream का उपयोग करके डिकंप्रेसिंग केवल पहली पंक्ति लौटाता है] (http: // stackoverflow .com/प्रश्न/11204330/decompressing-का उपयोग कर-gzipstream-रिटर्न-केवल-पहली पंक्ति) – Sam

उत्तर

6

बालों को खींचने के बाद मुझे लगता है कि मुझे समस्या मिली है। मेरे लिए समस्या इस तथ्य से आगे बढ़ी थी कि कुछ जीजेआईपी फाइलें ठीक काम करती हैं जबकि अन्य उपरोक्त व्यवहार प्रदर्शित करेंगे। उदाहरण के लिए, यदि मैंने स्वयं को जीज़िप के साथ संग्रह बनाया है तो यह बहुत अच्छा काम करेगा, लेकिन अन्य स्रोतों से उत्पन्न कुछ अन्य संग्रह नहीं होंगे।

संक्षेप में, .NET GZip लाइब्रेरी कचरा है, इसका उपयोग न करें। इसके अलावा, आईसीएसर्प कोड पुस्तकालय मैं उपयोग कर रहा था कुछ साल पुराना था। मुझे यकीन नहीं है कि यह अंतर्निहित .NET कोड पर पिगबैक का उपयोग करता है या नहीं, लेकिन मेरे द्वारा पहले संस्करण (0.85.4) ने वही व्यवहार दिया था। जब मैंने नवीनतम संस्करण (0.86.0) में अपग्रेड किया, तो यह अपेक्षित के रूप में काम करता था और मैं पूरी फ़ाइल को अपेक्षित रूप से पढ़ने में सक्षम था।

उम्मीद है कि यह एक ही मुद्दा

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