2011-01-05 22 views
13
ragazzi

HY,MonoTouch - ICSharpCode.SharpZipLib dando un errore

Sto cercando di generare un file ZIP con biblioteca ICSharpCode.SharpZipLib ma è gettando un errore davvero strano.

Codice:

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 
} 

Errore:

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 

Come posso fare questo sostegno codice CodePage 437?

saluti,
Claudio

+0

Secondo [questa segnalazione] [1 ] questo è stato risolto anni fa. Con quale versione di mono stai lavorando? [1]: https://bugs.launchpad.net/ubuntu/+source/mono/+bug/235858 – SilverbackNet

+0

L'ho aggiornato la settimana scorsa. Non penso sia un problema di aggiornamento. – Claudio

risposta

17

MonoTouch rimuove codepages I18N che non si può determinare in modo statico che è necessario. È possibile forzare MonoTouch per mantenere la raccolta tabella codici necessaria (Ovest), in questo caso uno dei due modi:

  1. fare clic su Progetto -> [ProjectName] Opzioni
  2. Selezionare iPhone Costruire
  3. Avete due opzioni in questo punto a. Selezionare "ovest" dall'elenco dei gruppi I18n b. Aggiungi "-i18n = ovest" a "Argomenti aggiuntivi"

NOTA: è necessario eseguire il passaggio 3 per ogni combinazione di configurazioni e piattaforme.

+0

Sì, funziona. Ma solo una domanda: se sto lavorando con i file zip, useremo qualcosa come la codifica di Huffman, leggendo il file/data bit per bit. Quindi non doveva chiedere informazioni sulla codepage, giusto? – Claudio

+0

Non ho idea di come sia implementato SharpZipLib, quindi non ho potuto commentare perché hanno bisogno/vogliono questa codepage. –

+0

Lo stesso errore e soluzione funzionano con DotNetZip in MonoTouch –

4

So che questo è un thread vecchio, ma ho appena trascorso un pomeriggio cercando di risolvere il problema con monodroid 4.6. Nella versione precedente il trucco consisteva nell'aggiungere manualmente un riferimento alle librerie I18N e I18N.WEST, ma ora, a partire dalla versione 4.6, non funziona più. :(

Così ho applicato una correzione al file ZipConstants.cs di SharpZipLib:

Da:

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

A:

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

Ho avuto lo stesso problema, questo ha fatto il trucco, tuttavia sarebbe bello con una soluzione migliore, più "pulita" di questa ... – Miros

+0

Attenzione a questa soluzione!Nel mio caso ha funzionato anche io, ma non sono stato in grado di decomprimere questi file in seguito. È venuto fuori con errori strani come "Directory centrale non trovata". – sprinter252

+0

Mi sono imbattuto nello stesso problema. Questo ha funzionato. Grazie. – Perry

Problemi correlati