41
ZIPクラスのフィードバックが 通るまで かめがわ かずし(@kkamegawa)

Road to success System.IO.Compression.ZipArchive Feedback

Embed Size (px)

Citation preview

Page 1: Road to success System.IO.Compression.ZipArchive Feedback

ZIPクラスのフィードバックが 通るまで

かめがわ かずし(@kkamegawa)

Page 2: Road to success System.IO.Compression.ZipArchive Feedback

自己紹介

かめがわ かずし /会社員 こみゅぷらす/codeseek/c#ユーザー会/TFSUGあたり

オンラインではkkamegawaというIDを使っています(twitter/hatena/Facebook/MSDN/Technet /SlideShare)

@ITさんで連載やってます。 いまさら聞けないWindows Serverの開発活用術 – 現在進行中

Visual Studioデバッグ手法

パフォーマンスチューニング

Page 3: Road to success System.IO.Compression.ZipArchive Feedback

.NET Framework 4.5新機能

引用元: http://msdn.microsoft.com/en-us/library/ms171868(VS.110).aspx

Page 4: Road to success System.IO.Compression.ZipArchive Feedback

引用元: http://msdn.microsoft.com/en-us/library/ms171868(VS.110).aspx

Page 5: Road to success System.IO.Compression.ZipArchive Feedback
Page 6: Road to success System.IO.Compression.ZipArchive Feedback

.NETにおけるZipリクエストの歴史

.NET 3.5時代から何度も要望されてきた(2012/6/16時点で4件以上connectに登録)、ものすごく希望数の多い要望の一つ。

System.IO.PackagingはOpenXML用なので実体はzipでも使えない

Page 7: Road to success System.IO.Compression.ZipArchive Feedback

今までどうしてた?

J# Runtimeに付属しているランタイムを使用する。

オープンソースのライブラリを使う

SharpZipLib

DotNetZip

IronPythonのソースの一部を使う

ExplorerのShellオブジェクトをCOMで呼び出す

Page 8: Road to success System.IO.Compression.ZipArchive Feedback
Page 9: Road to success System.IO.Compression.ZipArchive Feedback
Page 10: Road to success System.IO.Compression.ZipArchive Feedback
Page 11: Road to success System.IO.Compression.ZipArchive Feedback
Page 12: Road to success System.IO.Compression.ZipArchive Feedback

発端

コマンドでZipに圧縮したかった

IronPython 2.0にzip関係のソースがあると教えてもらった (2.6以降のソースにはないみたい)

IronPython2_0/src/Chironのこの二つ crc32.cs zip.cs

これを使って圧縮してほくほくしていた

Page 13: Road to success System.IO.Compression.ZipArchive Feedback

いざ使ってみると

展開すると日本語(ファイルおよびフォルダ名)がことごとく化けている!

ソースを調べたら、zipのヘッダに追加するファイル名がこうやって格納されていた

Byte[] namebytes = Encoding.UTF8.GetBytes(name);

Page 14: Road to success System.IO.Compression.ZipArchive Feedback
Page 15: Road to success System.IO.Compression.ZipArchive Feedback

直した

ExplorerのzipフォルダはWindows XP / Windows Meから

Explorerは(Windows 9xからのしがらみのため?)システムコードページに依存している?

MS932を使うように直したら、日本語Windowsでも正しく表示された! (しかし世界では通用しなさそう…)

Byte[] namebytes = Encoding.GetEncoding(932).GetBytes(name);

Page 16: Road to success System.IO.Compression.ZipArchive Feedback

Explorerのzipフォルダまとめ

Windows 7までのExplorerではメタデータにUTF-8で格納されると正しく扱えない。 (Mac使う人もWindowsとzipやり取りで困っているらしい)

調べたところ、zipの未使用ビットの一つをたてたらUTF-8にするという実装が始まってのちに、PKZIPの仕様書にも入った。(Windows XP発売ちょっと前)

Page 17: Road to success System.IO.Compression.ZipArchive Feedback

じゃあ、.NET 4.5は?

2011/9/20にVisual Studio 11 Developer PreviewがWindows 8 Developer Previewとともに公開された

さっそく、こんなコード書いた

using (var zip = new ZipArchive(@“c:¥temp¥あ¥ziptest.zip”, ZipArchiveMode.Create)){ var files = new DirectoryInfo(@“c:¥temp”).GetFiles(“*.*”); Array.ForEach(files, x => zip.CreateEntryFromFile(x.FullName, x.Name)); }

今は使えないコード

Page 18: Road to success System.IO.Compression.ZipArchive Feedback
Page 19: Road to success System.IO.Compression.ZipArchive Feedback
Page 20: Road to success System.IO.Compression.ZipArchive Feedback

Connectに登録(英語)

https://connect.microsoft.com/VisualStudio/feedback/details/711235/

Page 21: Road to success System.IO.Compression.ZipArchive Feedback
Page 22: Road to success System.IO.Compression.ZipArchive Feedback

BCL teamからの回答(抜粋)

エンコーディング情報をZIPのメタデータに持てないから、ほかの国に渡すとき、展開が正しくできないのではないか?

展開はフォールダウン(UTF-8でなければ現在のロケール)するから問題ないんじゃ?

PKZIPの仕様ではUTF-8で登録することになっている。

どういうシナリオで困るか、具体的に書いてほしい。

Page 23: Road to success System.IO.Compression.ZipArchive Feedback

参考(システムロケールとは)

非Unicodeアプリ

ケーションのロケールをどこにするかという設定。

システムワイド (ログオンユーザー非依存)

OSの初期設定

Page 24: Road to success System.IO.Compression.ZipArchive Feedback
Page 25: Road to success System.IO.Compression.ZipArchive Feedback
Page 26: Road to success System.IO.Compression.ZipArchive Feedback
Page 27: Road to success System.IO.Compression.ZipArchive Feedback

がんばって回答

Windows 7までのzipフォルダーでは、MS932エンコーディング(正確にはシステムロケール)でメタデータを保存する

日本では多くのユーザーデータのファイル名は日本語が使用されている

.NET Framework 4.5のプログラムでこのようなファイルを圧縮すると、過去の日本語Windowsで正しく展開できない

Page 28: Road to success System.IO.Compression.ZipArchive Feedback
Page 29: Road to success System.IO.Compression.ZipArchive Feedback
Page 30: Road to success System.IO.Compression.ZipArchive Feedback

再度別内容の要望で登録

https://connect.microsoft.com/VisualStudio/feedback/details/733046/

Page 31: Road to success System.IO.Compression.ZipArchive Feedback

BCL Teamからの回答

You know that we cannot make specific technical details public before things actually get released. But my hunch is that you will find this particular issue adequately addressed when .NET 4.5 comes out. (意訳:公開できないけど.NET 4.5の次のリリースではわかると思う)

Page 32: Road to success System.IO.Compression.ZipArchive Feedback
Page 33: Road to success System.IO.Compression.ZipArchive Feedback

そして5/31が来た

Visual Studio 2012 RCのドキュメントをチェック

引用元:http://msdn.microsoft.com/en-us/library/hh875101(VS.110).aspx

Page 34: Road to success System.IO.Compression.ZipArchive Feedback
Page 35: Road to success System.IO.Compression.ZipArchive Feedback

しかし実際どうよ?

日記でも書いたけど http://d.hatena.ne.jp/kkamegawa/20120601/ Windows XP~7までが生き残る間は仕方ない機能(Windows 7は仕様変更して…)。

基本的にはUTF-8で。もしくはそもそも日本語ファイル名を使用しない

これが必要なのはサーバーサイドでファイル圧縮するときが主だろうから。

Page 36: Road to success System.IO.Compression.ZipArchive Feedback

仕様変更依頼する際気を付ける点

困っている人がどれくらいいて、どういうシナリオで困るということを具体的に明示する

今回の場合、過去のWindowsとの相互運用で困ることをはっきり明示

可能な限り早い時点でのフィードバック ベータだとかなり厳しい。

Page 37: Road to success System.IO.Compression.ZipArchive Feedback

私のConnectへのフィードバック

私の場合あまりロケール非依存のことはやらない(全世界でやってくれる人多い)

しかし日本語のローカライズは日本人が見つけないと反映されない (今回も怪しい訳がそれなりにある。開発者は英語表記のままでも気にしない)

ローカライズは多分遅くても受け付けてくれる(はず)。

Page 38: Road to success System.IO.Compression.ZipArchive Feedback
Page 40: Road to success System.IO.Compression.ZipArchive Feedback

まとめ

チャンスは設けられているので、目の届くところでフィードバックしよう

日本語でも(時間はかかるけど)受け付けてくれる

今は仮想環境、VHDブートができるので、環境を分離して、安全に試せるよ!

Page 41: Road to success System.IO.Compression.ZipArchive Feedback