Road to success System.IO.Compression.ZipArchive Feedback

Post on 22-Jun-2015

18.987 views 4 download

Transcript of Road to success System.IO.Compression.ZipArchive Feedback

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

かめがわ かずし(@kkamegawa)

自己紹介

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

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

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

Visual Studioデバッグ手法

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

.NET Framework 4.5新機能

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

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

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

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

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

今までどうしてた?

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

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

SharpZipLib

DotNetZip

IronPythonのソースの一部を使う

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

発端

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

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

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

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

いざ使ってみると

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

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

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

直した

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

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

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

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

Explorerのzipフォルダまとめ

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

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

じゃあ、.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)); }

今は使えないコード

Connectに登録(英語)

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

BCL teamからの回答(抜粋)

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

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

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

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

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

非Unicodeアプリ

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

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

OSの初期設定

がんばって回答

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

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

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

再度別内容の要望で登録

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

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の次のリリースではわかると思う)

そして5/31が来た

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

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

しかし実際どうよ?

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

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

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

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

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

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

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

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

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

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

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

まとめ

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

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

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