コード例 #1
0
 private void OnFileExists(FileOverwriteEventArgs e)
 {
     if (this.FileExists == null)
     {
         return;
     }
     try
     {
         this.FileExists((object)this, e);
     }
     catch (Exception ex)
     {
         this._Extractor.AddException(ex);
     }
 }
コード例 #2
0
 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);
 }