void ExtractEntry(ZipEntry entry)
{
bool doExtraction = entry.IsCompressionMethodSupported();
string targetName = entry.Name;
if (doExtraction) {
if (entry.IsFile) {
targetName = extractNameTransform_.TransformFile(targetName);
} else if (entry.IsDirectory) {
targetName = extractNameTransform_.TransformDirectory(targetName);
}
doExtraction = !(string.IsNullOrEmpty(targetName));
}
// TODO: Fire delegate/throw exception were compression method not supported, or name is invalid?
string dirName = null;
if (doExtraction) {
if (entry.IsDirectory) {
dirName = targetName;
} else {
dirName = Path.GetDirectoryName(Path.GetFullPath(targetName));
}
}
if (doExtraction && !Directory.Exists(dirName)) {
if (!entry.IsDirectory || CreateEmptyDirectories) {
try {
Directory.CreateDirectory(dirName);
} catch (Exception ex) {
doExtraction = false;
if (events_ != null) {
if (entry.IsDirectory) {
continueRunning_ = events_.OnDirectoryFailure(targetName, ex);
} else {
continueRunning_ = events_.OnFileFailure(targetName, ex);
}
} else {
continueRunning_ = false;
throw;
}
}
}
}
if (doExtraction && entry.IsFile) {
ExtractFileEntry(entry, targetName);
}
}