« 意味のわからないウェブの記載 | トップページ | コドク・クロニクル(蠱毒伝奇?) »

2014年9月 8日 (月)

DotNetZipでEPUBファイルを作る

C#でEPUBファイル作ろうと思い、DotNetZipを使ってみた。

mimetypeを先頭に置いているのに、EPUBっぽくならない。ぐぐってみると、「EPUBではmimetypeは圧縮してはいけないが、DotNetZipは必ず圧縮する。そこで、適当なEPUBファイルを持ってきて、その先頭のmimetypeだけコピーして、云々」なんていう記事を発見。

いや、そんなことないでしょ、ZipEntry.CompressionMethodっていうプロパティがあって、これをNoneにすれば非圧縮メンバーを作れる。それでもEPUBにならなくて困ってるんだよ、こっちは、みたいな。

仕方ないので、ファイルを16進ダンプして良く見たら、ファイルヘッダーにextended fieldがついている。中身は「NTFS形式ファイルスタンプ」であった。

なるほど。

これを止めるには、ZipEntry.EmitTimesInWindowsFormatWhenSavingをfalseにすればよい。(Linux/Monoで動かすなら、ZipEntry.EmitTimesInUnixFormatWhenSavingをfalseにする。いちいちプラットフォームを調べる必要はなくて、常に両方ともfalseにしちゃうのが無難だと思う。)

つまり、こんな感じ。

    var mimetypeEntry = zipfile.Add("mimetype");
        mimetypeEntry.CompressionMethod = CompressionMethod.None;
        mimetypeEntry.EmitTimesInWindowsFormatWhenSaving = false;
        mimetypeEntry.EmitTimesInUnixFormatWhenSaving = false;

これで、cygwinのfile コマンドが"EPUB documen"と言ってくれるようになった。

« 意味のわからないウェブの記載 | トップページ | コドク・クロニクル(蠱毒伝奇?) »

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/285638/57315618

この記事へのトラックバック一覧です: DotNetZipでEPUBファイルを作る:

« 意味のわからないウェブの記載 | トップページ | コドク・クロニクル(蠱毒伝奇?) »