private void OnFileExists(FileOverwriteEventArgs e) { if (this.FileExists == null) { return; } try { this.FileExists((object)this, e); } catch (Exception ex) { this._Extractor.AddException(ex); } }
public int GetStream(uint index, out ISequentialOutStream outStream, AskMode askExtractMode) { outStream = (ISequentialOutStream)null; if (askExtractMode == AskMode.Extract) { string str1 = this._Directory; for (int index1 = 0; index1 < 1; ++index1) { if (!this._FileIndex.HasValue) { if (this._ActualIndexes == null || this._ActualIndexes.Contains(index)) { PropVariant var = new PropVariant(); this._Archive.GetProperty(index, ItemPropId.Path, ref var); string str2 = NativeMethods.SafeCast <string>(var, ""); if (string.IsNullOrEmpty(str2)) { if (this._FilesCount == 1) { string fileName = Path.GetFileName(this._Extractor.FileName); string str3 = fileName.Substring(0, fileName.LastIndexOf('.')); if (!str3.EndsWith(".tar", StringComparison.OrdinalIgnoreCase)) { str3 += ".tar"; } str2 = str3; } else { str2 = "[no name] " + index.ToString((IFormatProvider)CultureInfo.InvariantCulture); } } str1 += str2; this._Archive.GetProperty(index, ItemPropId.IsDirectory, ref var); try { str1 = ArchiveExtractCallback.ValidateFileName(str1); } catch (Exception ex) { this.AddException(ex); break; } if (!NativeMethods.SafeCast <bool>(var, false)) { this._Archive.GetProperty(index, ItemPropId.LastWriteTime, ref var); DateTime time = NativeMethods.SafeCast <DateTime>(var, DateTime.MinValue); if (File.Exists(str1)) { FileOverwriteEventArgs e = new FileOverwriteEventArgs(str1); this.OnFileExists(e); if (e.Cancel) { this.Canceled = true; return(-1); } if (string.IsNullOrEmpty(e.FileName)) { outStream = (ISequentialOutStream)this._FakeStream; break; } str1 = e.FileName; } try { this._FileStream = new OutStreamWrapper((Stream)File.Create(str1), str1, time, true); } catch (Exception ex) { if (ex is FileNotFoundException) { this.AddException((Exception) new IOException("The file \"" + str1 + "\" was not extracted due to the File.Create fail.")); } else { this.AddException(ex); } outStream = (ISequentialOutStream)this._FakeStream; break; } this._FileStream.BytesWritten += new EventHandler <IntEventArgs>(this.IntEventArgsHandler); outStream = (ISequentialOutStream)this._FileStream; } else if (!Directory.Exists(str1)) { try { Directory.CreateDirectory(str1); } catch (Exception ex) { this.AddException(ex); } outStream = (ISequentialOutStream)this._FakeStream; } } else { outStream = (ISequentialOutStream)this._FakeStream; } } else { uint num = index; uint?fileIndex = this._FileIndex; if (((int)num != (int)fileIndex.GetValueOrDefault() ? 0 : (fileIndex.HasValue ? 1 : 0)) != 0) { outStream = (ISequentialOutStream)this._FileStream; this._FileIndex = new uint?(); } else { outStream = (ISequentialOutStream)this._FakeStream; } } } this._DoneRate += 1f / (float)this._FilesCount; FileInfoEventArgs e1 = new FileInfoEventArgs(this._Extractor.ArchiveFileData[(int)index], PercentDoneEventArgs.ProducePercentDone(this._DoneRate)); this.OnFileExtractionStarted(e1); if (e1.Cancel) { if (!string.IsNullOrEmpty(str1)) { this._FileStream.Dispose(); if (File.Exists(str1)) { try { File.Delete(str1); } catch (Exception ex) { this.AddException(ex); } } } this.Canceled = true; return(-1); } } return(0); }