private void ExtractEntry()

in src/ICSharpCode.SharpZipLib/Zip/FastZip.cs [848:962]


		private 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 = string.Empty;

			if (doExtraction)
			{
				if (entry.IsDirectory)
				{
					dirName = targetName;
				}
				else
				{
					dirName = Path.GetDirectoryName(Path.GetFullPath(targetName));
				}
			}

			if (doExtraction && !Directory.Exists(dirName))
			{
				if (!entry.IsDirectory || CreateEmptyDirectories)
				{
					try
					{
						continueRunning_ = events_?.OnProcessDirectory(dirName, true) ?? true;
						if (continueRunning_)
						{
							Directory.CreateDirectory(dirName);
							if (entry.IsDirectory && restoreDateTimeOnExtract_)
							{
								switch (entryFactory_.Setting)
								{
									case TimeSetting.CreateTime:
										Directory.SetCreationTime(dirName, entry.DateTime);
										break;

									case TimeSetting.CreateTimeUtc:
										Directory.SetCreationTimeUtc(dirName, entry.DateTime);
										break;

									case TimeSetting.LastAccessTime:
										Directory.SetLastAccessTime(dirName, entry.DateTime);
										break;

									case TimeSetting.LastAccessTimeUtc:
										Directory.SetLastAccessTimeUtc(dirName, entry.DateTime);
										break;

									case TimeSetting.LastWriteTime:
										Directory.SetLastWriteTime(dirName, entry.DateTime);
										break;

									case TimeSetting.LastWriteTimeUtc:
										Directory.SetLastWriteTimeUtc(dirName, entry.DateTime);
										break;

									case TimeSetting.Fixed:
										Directory.SetLastWriteTime(dirName, entryFactory_.FixedDateTime);
										break;

									default:
										throw new ZipException("Unhandled time setting in ExtractEntry");
								}
							}
						}
						else
						{
							doExtraction = false;
						}
					}
					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);
			}
		}