Skip to content
Permalink
110 lines (90 sloc) 3.28 KB
using Ionic.Zip;
using ModernizedAlice.ArtOfWords.BizCommon.Model.SaveAndLoad;
using ModernizedAlice.ArtOfWords.Services.FileExpander;
using ModernizedAlice.IPlugin.ModuleInterface;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Xml.Serialization;
namespace ModernizedAlice.ArtOfWords.Services.Manager
{
public enum LoadResult
{
Succeed,
Failed,
}
public class LoadManager
{
private IEditor _iEditor;
public LoadManager(IEditor iEditor)
{
_iEditor = iEditor;
}
public LoadFileInfo LoadFileInfo
{
get;
set;
}
public void LoadFileInfoFile(string folderPath)
{
string versionFilePath = folderPath + "\\version.xml";
if (!File.Exists(versionFilePath))
{
LoadFileInfo = new LoadFileInfo()
{
version = FileVersion.Ver1_0_0
};
return ;
}
// ちゃんとしたファイルを書き出す。
XmlSerializer serializer = new XmlSerializer(typeof(LoadFileInfo));
FileStream outstream = new System.IO.FileStream(versionFilePath, System.IO.FileMode.Open);
LoadFileInfo = (LoadFileInfo)serializer.Deserialize(outstream);
outstream.Close();
}
public LoadResult Load(String path)
{
try
{
string folderPath;
OpenZip(path, out folderPath);
LoadFileInfoFile(folderPath);
var expander = FileExpanderFactory.GetExpander(LoadFileInfo);
if (expander == null)
{
Directory.Delete(Path.GetDirectoryName(folderPath), true);
throw new Exception("このファイルは展開できません");
}
expander.Expand(folderPath, _iEditor);
Directory.Delete(folderPath, true);
}
catch (Exception )
{
return LoadResult.Failed;
}
return LoadResult.Succeed;
}
private bool OpenZip(String path, out string outpath)
{
//ZipFileを作成する
using (Ionic.Zip.ZipFile zip = ZipFile.Read(path, new ReadOptions(){Encoding = Encoding.GetEncoding("shift_jis")}))
{
zip.CompressionLevel = Ionic.Zlib.CompressionLevel.BestCompression;
zip.ExtractExistingFile = Ionic.Zip.ExtractExistingFileAction.OverwriteSilently;
//エラーが出てもスキップする。デフォルトはThrow。
zip.ZipErrorAction = Ionic.Zip.ZipErrorAction.Skip;
zip.Password = "ohaDNelson";
zip.Encryption = Ionic.Zip.EncryptionAlgorithm.WinZipAes256;
// Tempフォルダーに書き出し隔離
string tempFolder = Path.GetTempPath() + Path.GetRandomFileName();
Directory.CreateDirectory(tempFolder);
//フォルダを追加する
zip.ExtractAll(tempFolder);
outpath = tempFolder;
}
return true;
}
}
}