2010-06-18 22 views
7

Gzip dosyalarını indiren bazı kodlarım var ve bunları açıyor. Sorun şu ki, tüm dosyayı açmak için alamıyorum, sadece ilk 4096 bayt ve ardından yaklaşık 500 daha fazla okuyor.GZipStream tüm dosyayı okumıyor

Byte[] buffer = new Byte[4096]; 
int count = 0; 
FileStream fileInput = new FileStream("input.gzip", FileMode.Open, FileAccess.Read, FileShare.Read); 
FileStream fileOutput = new FileStream("output.dat", FileMode.Create, FileAccess.Write, FileShare.None); 
GZipStream gzipStream = new GZipStream(fileInput, CompressionMode.Decompress, true); 

// Read from gzip steam 
while ((count = gzipStream.Read(buffer, 0, buffer.Length)) > 0) 
{ 
    // Write to output file 
    fileOutput.Write(buffer, 0, count); 
} 

// Close the streams 
... 

İndirilen dosyayı kontrol ettim; sıkıştırıldığında 13 MB ve bir XML dosyası içerir. XML dosyasını el ile açtım ve içeriğin tamamı orada. Ancak bu kodu kullanarak yaptığım zaman, sadece XML dosyasının başlangıcını çıkarır.

Bunun neden olabileceği konusunda herhangi bir fikri olan var mı?

+0

kullanabilirsiniz. Bununla birlikte, bitirdiğim çalışma koduna baktım ve 'kullanma' bloklarına sarılmanın yanında sizinkilere benziyor. –

+3

Flush() yöntemini mi arıyorsunuz? – n535

+0

Flush() ile çalıştı, yardım etmedi. – Edgar

cevap

1

GZipStream yerine dekompresyon yapmak için bir gzip yürütülebilir dosyasını kullanarak sona erdim. Dosya herhangi bir nedenden dolayı işleyemez, ancak yürütülebilir.

+0

Son halini gönderebilir misiniz lütfen. Tam olarak gzip'i nasıl çalıştırdığınızı görmek isterim. – ManInMoon

+0

Üzgünüm, artık kodlara erişimim yok. Gzip yürütülebilir dosyasını çağırmak için Process sınıfını kullandı. Bu yardımcı olabilir: http://www.dotnetperls.com/7-zip – Edgar

4

DÜZENLEME

açık GZipStream bırakmıyorum deneyin:

GZipStream gzipStream = new GZipStream(fileInput, CompressionMode.Decompress, 
                     false); 

veya

GZipStream gzipStream = new GZipStream(fileInput, CompressionMode.Decompress); 
+0

Evet, CopyTo() yöntemini denedim. Sonuç aynı. Neden bundan daha fazla okuyamayacağı konusunda hiçbir fikrim yok. – Edgar

+0

İfadeleri kullanarak çalıştı; değişiklik yok. – Edgar

+0

GZipStream açıktan çıkılmadan çalıştı; değişiklik yok. – Edgar

0

Eğer fileOutput üzerinde Close veya Flush diyorsun? (Ya da sadece uygulama önerilir bir using sarın.) Eğer program bittiğinde dosya diske temizlenmiş olmayabilir.

+0

Okuma tamamlandıktan sonra tüm 3 akış kapanır. Sorun, verilerin çıktı dosyasına doğru yazılmadığı değil, Read() öğesinin tüm girdi dosyasını okumadığıdır. Bir şey kesintiye uğratabilir mi? Durmadan önce her defasında tam bayt sayısını okur, bu da meraklıdır. – Edgar

+0

İlk okunmanın ardından 'sayının değeri nedir? –

+0

İlk okumadan sonra 4096, ikinci okuma 532 ve sonra durur. – Edgar

1

Aynı şey bana da oldu. Benim durumumda sadece 6 satıra kadar okur ve daha sonra dosya sonuna ulaşır. Bu yüzden, uzantının gz olmasına rağmen, GZipStream tarafından desteklenmeyen başka bir algoritma tarafından sıkıştırıldığını fark ettim. Bu yüzden SevenZipSharp kütüphanesini kullandım ve işe yaradı. Bu benim kod

olduğunu Benim bir dekompresyon rutin yazarken ben bu sorunu aldığımı hatırlıyorum SevenZipSharp kütüphaneye

using (var input = File.OpenRead(lstFiles[0])) 
{ 
    using (var ds = new SevenZipExtractor(input)) 
    { 
     //ds.ExtractionFinished += DsOnExtractionFinished; 

     var mem = new MemoryStream(); 
     ds.ExtractFile(0, mem); 

     using (var sr = new StreamReader(mem)) 
     { 
      var iCount = 0; 
      String line; 
      mem.Position = 0; 
      while ((line = sr.ReadLine()) != null && iCount < 100) 
      { 
       iCount++; 
       LstOutput.Items.Add(line); 
      } 

     } 
    } 
}