开发者

Monotouch - ICSharpCode.SharpZipLib giving an error

开发者 https://www.devze.com 2023-02-02 05:51 出处:网络
Hy guys, I\'m trying to generate a Zip File with ICSharpCode.SharpZipLib library but it\'s throwing a really weird error.

Hy guys,

I'm trying to generate a Zip File with ICSharpCode.SharpZipLib library but it's throwing a really weird error.

Code:

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
}

Error:

Unhandled Exception: System.NotSupportedException: CodePage 437 not supported
  at System.Text.Encoding.GetEncoding (Int32 codepage) [0x00000] in开发者_C百科 <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 

How can I make this code support CodePage 437?

Regards,

Claudio


MonoTouch removes I18N codepages that it cannot statically determine that you need. You can force monotouch to keep the needed codepage collection (West) in this case one of two ways:

  1. Click Project->[ProjectName] Options
  2. Select iPhone Build
  3. You have two options at this point a. Select "west" from the I18n assemblies list b. Add "-i18n=west" to "Extra Arguments"

NOTE: You will need to perform step #3 for every combination of configurations and platforms.


I know this is an old thread, but I just spent an afternoon trying to fix this with monodroid 4.6. On the previous version the trick was to manually add a reference to the I18N and I18N.WEST libraries, but now starting with version 4.6 it doesn't work anymore. :(

So I applied a fix to the ZipConstants.cs file of SharpZipLib:

From:

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

To:

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

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号