using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CBR.Core.Helpers;
using System.IO;
using CBR.Core.Services;
namespace CBR.Core.Files.Conversion
{
internal class ZIPWriter : IWriterContract
{
public void Write(string outputFileName, string inputFolder, string outputFolder, List<byte[]> imageBytes, List<string> imageNames, ContractParameters settings, ProgressDelegate progress)
{
try
{
string file_out;
// in this case, just zip the folder in shortFileName
if (!string.IsNullOrEmpty(inputFolder))
{
file_out = CompressFolder(outputFileName, inputFolder, outputFolder, settings, progress);
// temp folders
if (inputFolder.Contains(CatalogService.Instance.ApplicationPath))
Directory.Delete(inputFolder);
}
else // write the men to temp folder
{
string tempFolder = Path.Combine(CatalogService.Instance.ApplicationPath, outputFileName);
Directory.CreateDirectory(tempFolder);
//first write in temp folder
new ImageFileWriter().Write(outputFileName, inputFolder, tempFolder, imageBytes, imageNames, settings, progress);
file_out = CompressFolder(outputFileName, tempFolder, outputFolder, settings, progress);
Directory.Delete(tempFolder, true);
}
if (settings.ResfreshLibrary)
settings.ResultFiles.Add(file_out);
}
catch (Exception err)
{
ExceptionHelper.Manage("ZIPWriter:Write", err);
settings.Result = false;
}
}
internal string CompressFolder(string outputFileName, string inputFolder, string outputFolder, ContractParameters settings, ProgressDelegate progress)
{
try
{
// move up from one directory if same as source in case of files
if (string.IsNullOrEmpty(settings.DestinationPath) && settings.InputType == BookType.ImageFile)
outputFolder = Directory.GetParent(outputFolder).FullName;
string file_out = Path.Combine(outputFolder, outputFileName + ".cbz");
if (File.Exists(file_out))
File.Delete(file_out);
SevenZip.SevenZipCompressor cp = new SevenZip.SevenZipCompressor();
cp.ArchiveFormat = SevenZip.OutArchiveFormat.Zip;
string[] outputFiles = new DirectoryInfo(inputFolder).GetFiles("*.*").Select(p => p.FullName).ToArray();
using (FileStream fs = new FileStream(file_out, FileMode.Create))
{
cp.CompressFiles(fs, outputFiles);
}
progress(string.Format("{0} images zipped...", outputFiles.Length));
return file_out;
}
catch (Exception err)
{
ExceptionHelper.Manage("ZIPWriter:Write", err);
settings.Result = false;
return string.Empty;
}
finally
{
}
}
}
}