Если вам нужно контролировать порядок записей в файле ZIP, вы можете использовать DotNetZip и ZipOutputStream.
Вы сказали, что пробовали DotNetZip, и он (валидатор epub) выдал ошибку, сообщающую о типе mime. Вероятно, это связано с тем, что вы использовали тип ZipFile в DotNetZip. Если вы используете ZipOutputStream, вы можете управлять порядком записей zip, что, по-видимому, важно для epub (я не знаю формат, просто предположив).
РЕДАКТИРОВАТЬ
Я только что проверил, и на странице epub в Википедии описано, как вам нужно отформатировать файл .epub. В нем говорится, что файл mimetype должен содержать определенный текст, должен быть несжатым и незашифрованным и должен отображаться как первый файл в ZIP-архиве.
Используя ZipOutputStream, вы могли бы сделать это, установив CompressionLevel = None для этого конкретного ZipEntry - это значение не является значением по умолчанию.
Вот пример кода:
private void Zipup()
{
string _outputFileName = "Fargle.epub";
using (FileStream fs = File.Open(_outputFileName, FileMode.Create, FileAccess.ReadWrite ))
{
using (var output= new ZipOutputStream(fs))
{
var e = output.PutNextEntry("mimetype");
e.CompressionLevel = CompressionLevel.None;
byte[] buffer= System.Text.Encoding.ASCII.GetBytes("application/epub+zip");
output.Write(buffer,0,buffer.Length);
output.PutNextEntry("META-INF/container.xml");
WriteExistingFile(output, "META-INF/container.xml");
output.PutNextEntry("OPS/"); // another directory
output.PutNextEntry("OPS/whatever.xhtml");
WriteExistingFile(output, "OPS/whatever.xhtml");
// ...
}
}
}
private void WriteExistingFile(Stream output, string filename)
{
using (FileStream fs = File.Open(fileName, FileMode.Read))
{
int n = -1;
byte[] buffer = new byte[2048];
while ((n = fs.Read(buffer,0,buffer.Length)) > 0)
{
output.Write(buffer,0,n);
}
}
}
См. Документацию для ZipOutputStream здесь .