2010-11-22 75 views
9

Tôi đang sử dụng ICSharpCode.SharpZipLib.Zip.FastZip để zip file nhưng tôi bị mắc kẹt trên một vấn đề:ICSharpCode.SharpZipLib.Zip.FastZip không nén file có ký tự đặc biệt trong tên tập tin của họ

Khi tôi cố gắng nén một file với ký tự đặc biệt trong tên tệp của nó, nó không hoạt động. Nó hoạt động khi không có ký tự đặc biệt nào trong tên tệp.

+0

Khi bạn nói nó không hoạt động, _what_ không hoạt động? Bạn có thể vui lòng đăng mã của bạn và thông báo lỗi bạn đang nhận được không? –

+0

Nó không zip tập tin đó, tôi cũng không nhận được bất kỳ lỗi nào – BreakHead

+0

nó hoạt động mà không có các ký tự đặc biệt? –

Trả lời

0

Khả năng 1: bạn đang chuyển tên tệp tới bộ lọc tệp regex.

Khả năng 2: những nhân vật không được phép vào file zip (hoặc ít nhất SharpZipLib nghĩ như vậy)

6

Tôi nghĩ rằng bạn không thể sử dụng FastZip. Bạn cần phải lặp các tập tin và thêm các mục mình xác định:

entry.IsUnicodeText = true;

Để nói SharpZipLib mục là 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, Nó quá lớn, chính xác là điều tôi muốn Cảm ơn rất nhiều –

+0

@M_Mogharrabi nếu một trong những câu trả lời thực sự giải quyết được vấn đề của bạn, bạn phải đánh dấu nó là được chấp nhận. giải pháp tương tự như Paaland (chỉ cần cuộn lên), ngoại trừ tôi đã nhanh hơn :) – Salaros

+0

Làm thế nào là ngày 20 tháng 12 năm 2012 sớm hơn ngày 26 tháng 3 năm 2011? Và tại sao mở lại bài đăng cổ đại này? – Paaland

0

cố gắng lấy ra ký tự đặc biệt từ tên tệp, i, e thay thế. bạn Filename.Replace("&", "&");

1

Bạn cần phải tải về và biên dịch phiên bản mới nhất của thư viện SharpZipLib, do đó bạn có thể sử dụng

entry.IsUnicodeText = true; 

đây là đoạn mã của bạn (chút thay đổi):

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

Bạn có thể tiếp tục sử dụng FastZip nếu bạn muốn, nhưng bạn cần phải cung cấp cho nó ZipEntryFactory tạo ZipEntry s với IsUnicodeText = true.

var zfe = new ZipEntryFactory { IsUnicodeText = true }; 
var fz = new FastZip { EntryFactory = zfe }; 
fz.CreateZip("out.zip", "C:\in", true, null); 
Các vấn đề liên quan