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"と言ってくれるようになった。
« 意味のわからないウェブの記載 | トップページ | コドク・クロニクル(蠱毒伝奇?) »


コメント