2010-11-22 2 views
9

ich ICSharpCode.SharpZipLib.Zip.FastZip bin mit Dateien zip, aber ich bin auf einem Problem stecken:ICSharpCode.SharpZipLib.Zip.FastZip nicht Zippen von Dateien mit Sonderzeichen im Dateinamen

Wenn ich versuche, eine Datei mit Sonderzeichen zip in seinem Dateinamen funktioniert es nicht. Es funktioniert, wenn der Dateiname keine Sonderzeichen enthält.

+0

Wenn Sie sagen, dass es nicht funktioniert, _what_ funktioniert nicht? Können Sie bitte Ihren Code und die Fehlermeldung, die Sie bekommen, posten? –

+0

Es nicht zip diese Datei, auch bekomme ich keinen Fehler – BreakHead

+0

funktioniert es ohne die Sonderzeichen? –

Antwort

0

Möglichkeit 1: Sie übergeben einen Dateinamen an den Regex-Dateifilter.

Möglichkeit 2: diese Zeichen sind nicht in Zip-Dateien erlaubt (oder zumindest SharpZipLib denkt so)

6

Ich glaube, Sie nicht FastZip verwenden können. Sie müssen die Dateien iterieren und fügen Sie die Einträge selbst festgelegt wird:

entry.IsUnicodeText = true;

SharpZipLib sagen, der Eintrag ist Unicode.

string[] filenames = Directory.GetFiles(sTargetFolderPath); 

// Zip up the files - From SharpZipLib Demo Code 
using (ZipOutputStream s = new 
    ZipOutputStream(File.Create("MyZipFile.zip"))) 
{ 
    s.SetLevel(9); // 0-9, 9 being the highest compression 

    byte[] buffer = new byte[4096]; 

    foreach (string file in filenames) 
    { 
     ZipEntry entry = new ZipEntry(Path.GetFileName(file)); 

     entry.DateTime = DateTime.Now; 
     entry.IsUnicodeText = true; 
     s.PutNextEntry(entry); 

     using (FileStream fs = File.OpenRead(file)) 
     { 
      int sourceBytes; 
      do 
      { 
       sourceBytes = fs.Read(buffer, 0, buffer.Length); 

       s.Write(buffer, 0, sourceBytes); 

      } while (sourceBytes > 0); 
     } 
    } 
    s.Finish(); 
    s.Close(); 
} 
+0

+1000, Ey vaaaal, Es ist zu groß. Es ist genau das, was ich will. Vielen Dank. –

+0

@M_Mogharrabi Wenn eine der Antworten Ihr Problem tatsächlich gelöst hat, müssen Sie es als akzeptiert markieren. Zum Beispiel habe ich die gleiche Lösung wie Paaland (scrollen Sie einfach nach oben), außer dass ich schneller war :) – Salaros

+0

Wie ist der 20. Dezember 2012 früher als der 26.März 2011? Und warum diesen alten Post wieder öffnen? – Paaland

0

versuchen Sie, das Sonderzeichen aus dem Dateinamen herauszunehmen, ersetzen Sie es. Ihre Filename.Replace("&", "&");

1

Sie müssen herunterladen und die neueste Version von SharpZipLib Bibliothek kompilieren, so dass Sie

entry.IsUnicodeText = true; 

hier Ihre Schnipsel ist (leicht modifiziert) verwenden können:

FileInfo file = new FileInfo("input.ext"); 
using(var sw = new FileStream("output.zip", FileMode.OpenOrCreate, FileAccess.ReadWrite)) 
{ 
    using(var zipStream = new ZipOutputStream(sw)) 
    { 
     var entry = new ZipEntry(file.Name); 
     entry.IsUnicodeText = true; 
     zipStream.PutNextEntry(entry); 

     using (var reader = new FileStream(file.FullName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) 
     { 
      byte[] buffer = new byte[4096]; 
      int bytesRead; 
      while ((bytesRead = reader.Read(buffer, 0, buffer.Length)) > 0) 
      { 
       byte[] actual = new byte[bytesRead]; 
       Buffer.BlockCopy(buffer, 0, actual, 0, bytesRead); 
       zipStream.Write(actual, 0, actual.Length); 
      } 
     } 
    } 
} 
2

Sie können weiterhin mit FastZip wenn Sie möchten, aber Sie müssen es eine ZipEntryFactory geben, die ZipEntry s mit IsUnicodeText = true erstellt.

var zfe = new ZipEntryFactory { IsUnicodeText = true }; 
var fz = new FastZip { EntryFactory = zfe }; 
fz.CreateZip("out.zip", "C:\in", true, null);