2011-01-05 11 views
13

Hy adamları,MonoTouch - ICSharpCode.SharpZipLib Ben ICSharpCode.SharpZipLib kütüphanesi ile bir Zip Dosyası oluşturmak için çalışıyorum ama gerçekten garip hata atıyor bir hatayı

vererek.

Kodu:

public static void ZipFiles(string inputFolderPath, string outputPathAndFile, string password)  
{ 
     ArrayList ar = GenerateFileList(inputFolderPath); // generate file list 
     int TrimLength = (Directory.GetParent(inputFolderPath)).ToString().Length; 

     TrimLength += 1; //remove '\' 
     FileStream ostream; 
     byte[] obuffer; 

     ZipOutputStream oZipStream = new ZipOutputStream(File.Create(outputPathAndFile)); // create zip stream 
     if (password != null && password != String.Empty) 
      oZipStream.Password = password; 
     oZipStream.SetLevel(9); // maximum compression 
     ZipEntry oZipEntry; 
     foreach (string Fil in ar) // for each file, generate a zipentry 
     { 
      oZipEntry = new ZipEntry(Fil.Remove(0, TrimLength)); 
      oZipStream.PutNextEntry(oZipEntry); 

      if (!Fil.EndsWith(@"/")) // if a file ends with '/' its a directory 
      { 
       ostream = File.OpenRead(Fil); 
       obuffer = new byte[ostream.Length]; 
       ostream.Read(obuffer, 0, obuffer.Length); 
       oZipStream.Write(obuffer, 0, obuffer.Length); 
      } 
     } 
     oZipStream.Finish(); 
     oZipStream.Close(); 
} 


private static ArrayList GenerateFileList(string Dir) 
{ 
     ArrayList fils = new ArrayList(); 
     bool Empty = true; 
     foreach (string file in Directory.GetFiles(Dir,"*.xml")) // add each file in directory 
     { 
      fils.Add(file); 
      Empty = false; 
     } 

     if (Empty) 
     { 
      if (Directory.GetDirectories(Dir).Length == 0) 
       // if directory is completely empty, add it 
      { 
       fils.Add(Dir + @"/"); 
      } 
     } 

     foreach (string dirs in Directory.GetDirectories(Dir)) // recursive 
     { 
      foreach (object obj in GenerateFileList(dirs)) 
      { 
       fils.Add(obj); 
      } 
     } 
     return fils; // return file list 
} 

Hata:

Unhandled Exception: System.NotSupportedException: CodePage 437 not supported 
    at System.Text.Encoding.GetEncoding (Int32 codepage) [0x00000] in <filename unknown>:0 
    at ICSharpCode.SharpZipLib.Zip.ZipConstants.ConvertToArray (System.String str) [0x00000] in <filename unknown>:0 
    at ICSharpCode.SharpZipLib.Zip.ZipConstants.ConvertToArray (Int32 flags, System.String str) [0x00000] in <filename unknown>:0 
    at ICSharpCode.SharpZipLib.Zip.ZipOutputStream.PutNextEntry (ICSharpCode.SharpZipLib.Zip.ZipEntry entry) [0x00000] in <filename unknown>:0 
    at WpfPrototype1.MainInvoicesView.ZipFiles (System.String inputFolderPath, System.String outputPathAndFile, System.String password) [0x00000] in <filename unknown>:0 
    at WpfPrototype1.MainInvoicesView.<ViewDidLoad>m__6 (System.Object , System.EventArgs) [0x00000] in <filename unknown>:0 
    at MonoTouch.UIKit.UIControlEventProxy.Activated() [0x00000] in <filename unknown>:0 
    at (wrapper managed-to-native) MonoTouch.UIKit.UIApplication:UIApplicationMain (int,string[],intptr,intptr) 
    at MonoTouch.UIKit.UIApplication.Main (System.String[] args, System.String principalClassName, System.String delegateClassName) [0x00000] in <filename unknown>:0 
    at MonoTouch.UIKit.UIApplication.Main (System.String[] args) [0x00000] in <filename unknown>:0 
    at WpfPrototype1.Application.Main (System.String[] args) [0x00000] in <filename unknown>:0 

nasıl CodePage 437 bu kod desteği yapabilir?

Selamlar,
Claudio

+0

[bu hata raporu] [1 uyarınca ] Bu yıl önce sabitlendi.O ne mono sürümü ile çalışıyorsunuz? [1]: https://bugs.launchpad.net/ubuntu/+source/mono/+bug/235858 – SilverbackNet

+0

Geçen hafta onu güncelledim. Bunun bir güncelleme sorunu olduğunu düşünmüyorum. – Claudio

cevap

17

MonoTouch statik olarak ihtiyacınız olduğunu tespit edemez I18N kod sayfaları kaldırır. Bu durumda gerekli kod sayfası koleksiyonu (Batı) tutmak için MonoTouch zorlayabilir iki yoldan biri:

  1. tıklayın Projesi -> [ProjeAdı] Seçenekler
  2. Seç iPhone kurmak
  3. Bu işte iki seçenek vardır point a. I18n derlemeler listesinden "batı" yı seçin b. "-i18n = batı" dan "Ekstra Argümanlar" Add

NOT: yapılandırmaları ve platformların her kombinasyon için adım 3. gerçekleştirmek gerekecektir.

+0

Evet, işe yarıyor. Ama sadece bir soru: eğer zip dosyaları ile çalışıyorsam, Huffman'ın kodlaması gibi bir şey kullanacak, bit başına dosya/veri biti okuyacak. Yani kod sayfası hakkında soru sormamalıydı, değil mi? – Claudio

+0

SharpZipLib'in nasıl uygulandığı hakkında hiçbir fikrim yok, bu yüzden neden bu kod sayfasına ihtiyaç duyduklarını/istediklerini açıklayamadım. –

+0

MonoTouch –

4

Bu eski bir iş parçacığı olduğunu biliyorum, ancak bir öğleden sonra bunu monodroid 4.6 ile düzeltmeye çalıştım. Önceki versiyonda hile, I18N ve I18N.WEST kütüphanelerine manuel olarak bir referans eklemekti, ancak şimdi 4.6 sürümünden başlayarak artık çalışmıyor. :(

Yani SharpZipLib ait ZipConstants.cs dosyasına bir düzeltme uygulanan:

Gönderen:

static int defaultCodePage = Thread.CurrentThread.CurrentCulture.TextInfo.OEMCodePage; 

için:

static int defaultCodePage = System.Text.Encoding.UTF8.CodePage; 
+0

gibi başka bir geçici çözüm gereklidir. Ben de aynı sorun vardı, bu hile yaptı, ancak daha iyi, daha "temiz" bir düzeltme daha iyi olurdu ... – Miros

+0

Bu çözüme dikkat!Benim durumumda da çalıştı ama sonra bu dosyaları unzip mümkün değildi. "Merkezi dizin bulunamadı." Gibi garip hatalarla geldi. – sprinter252

+0

Aynı konuyla karşılaştım. Bu çalıştı. Teşekkürler. – Perry

İlgili konular