public static XRefArchive Open(string file, XRefArchiveMode mode)
{
if (file == null)
{
throw new ArgumentNullException(nameof(file));
}
FileStream fs = null;
ZipArchive archive = null;
try
{
bool isReadOnly = false;
List<string> entries;
switch (mode)
{
case XRefArchiveMode.Read:
isReadOnly = true;
goto case XRefArchiveMode.Update;
case XRefArchiveMode.Update:
if (!File.Exists(file))
{
throw new FileNotFoundException($"File not found: {file}", file);
}
fs = File.Open(file, FileMode.Open, isReadOnly ? FileAccess.Read : FileAccess.ReadWrite);
archive = new ZipArchive(fs, isReadOnly ? ZipArchiveMode.Read : ZipArchiveMode.Update);
entries = (from entry in archive.Entries
select entry.FullName).ToList();
entries.Sort(StringComparer.OrdinalIgnoreCase);
break;
case XRefArchiveMode.Create:
var directory = Path.GetDirectoryName(file);
if (!string.IsNullOrEmpty(directory))
{
Directory.CreateDirectory(directory);
}
fs = File.Create(file);
archive = new ZipArchive(fs, ZipArchiveMode.Update);
entries = new List<string>();
break;
default:
throw new ArgumentOutOfRangeException(nameof(mode));
}
return new XRefArchive(mode, archive, entries);
}
catch (Exception) when (fs != null)
{
if (archive != null)
{
archive.Dispose();
}
fs.Close();
throw;
}
}