[id:kkamegawa:20120601:p1]のコメントで教えていただきました。ありがとうございます。
File names are corrupted after you decompress a .zip file in Windows 7 or in Windows Server 2008 R2
タイトルからはわかりづらいですが、Windows 7およびWindows Server 2008 R2のzipフォルダーにUTF-8仕様のzip展開をサポートする機能です。すばらしい!待ち望んでいたものです。実際にやってみましょう。Visual Studio 2012 RCと.NET Framework 4.5でこんなソースを書いて、マルチバイトのファイル名をzipに格納します。
using System.IO; using System.IO.Compression; //(略) var path = @"C:\temp\新しいフォルダー"; var zipName = Path.Combine(path, @"c:\temp\arc.zip"); using (var sw = new FileStream(zipName, FileMode.CreateNew)) { var Files = new DirectoryInfo(path); using (var pack = new ZipArchive(sw, ZipArchiveMode.Create)) { Array.ForEach(Files.GetFiles("*.*"), x => { var Entry = pack.CreateEntry(x.Name); using(var Writer = new StreamWriter(Entry.Open())){ Writer.WriteLine("テストテスト"); } }); } }
このコードではzipのメタデータをUTF-8仕様で作ります。Shift-JISで圧縮したい場合はZipArchiveクラスのコンストラクタにEncodingを指定してください。
上記のコードではEncodingを指定していないため、「新しいテキストドキュメント.txt」のような多バイトのファイルがあった場合、KB2704299のパッチを当てていないWindows 7ではこのように化けます。
しかし、KB2704299のパッチをあてたWindows 7ではこのようにちゃんとUTF-8で格納されたzipファイルを正しく扱うことができます。
すばらしい。これでMac OSなどで圧縮した多バイト系のファイルも正しく展開することができますね!