public long TruncateBackward(uint diskNumber, long offset)
 {
     if (diskNumber >= 99u)
     {
         throw new ArgumentOutOfRangeException("diskNumber");
     }
     if (this.rwMode != ZipSegmentedStream.RwMode.Write)
     {
         this._exceptionPending = true;
         throw new ZipException("bad state.");
     }
     if (diskNumber == this.CurrentSegment)
     {
         return(this._innerStream.Seek(offset, SeekOrigin.Begin));
     }
     if (this._innerStream != null)
     {
         this._innerStream.Dispose();
         if (File.Exists(this._currentTempName))
         {
             File.Delete(this._currentTempName);
         }
     }
     for (uint num = this.CurrentSegment - 1u; num > diskNumber; num -= 1u)
     {
         string path = this._NameForSegment(num);
         if (File.Exists(path))
         {
             File.Delete(path);
         }
     }
     this.CurrentSegment = diskNumber;
     for (int i = 0; i < 3; i++)
     {
         try
         {
             this._currentTempName = SharedUtilities.InternalGetTempFileName();
             File.Move(this.CurrentName, this._currentTempName);
             break;
         }
         catch (IOException)
         {
             if (i == 2)
             {
                 throw;
             }
         }
     }
     this._innerStream = new FileStream(this._currentTempName, FileMode.Open);
     return(this._innerStream.Seek(offset, SeekOrigin.Begin));
 }
Example #2
0
 public static void CreateAndOpenUniqueTempFile(string dir, out Stream fs, out string filename)
 {
     for (int i = 0; i < 3; i++)
     {
         try
         {
             filename = Path.Combine(dir, SharedUtilities.InternalGetTempFileName());
             fs       = new FileStream(filename, FileMode.CreateNew);
             return;
         }
         catch (IOException)
         {
             if (i == 2)
             {
                 throw;
             }
         }
     }
     throw new IOException();
 }
Example #3
0
        public long TruncateBackward(uint diskNumber, long offset)
        {
            // Console.WriteLine("***ZSS.Trunc to disk {0}", diskNumber);
            // Console.WriteLine("***ZSS.Trunc:  current disk {0}", CurrentSegment);
            if (diskNumber >= 99)
            {
                throw new ArgumentOutOfRangeException("diskNumber");
            }

            if (rwMode != RwMode.Write)
            {
                _exceptionPending = true;
                throw new ZipException("bad state.");
            }

            // Seek back in the segmented stream to a (maybe) prior segment.

            // Check if it is the same segment.  If it is, very simple.
            if (diskNumber == CurrentSegment)
            {
                var x = _innerStream.Seek(offset, SeekOrigin.Begin);
                // workitem 10178
                Pathfinding.Ionic.Zip.SharedUtilities.Workaround_Ladybug318918(_innerStream);
                return(x);
            }

            // Seeking back to a prior segment.
            // The current segment and any intervening segments must be removed.
            // First, close the current segment, and then remove it.
            if (_innerStream != null)
            {
#if NETCF
                _innerStream.Close();
#else
                _innerStream.Dispose();
#endif
                if (File.Exists(_currentTempName))
                {
                    File.Delete(_currentTempName);
                }
            }

            // Now, remove intervening segments.
            for (uint j = CurrentSegment - 1; j > diskNumber; j--)
            {
                string s = _NameForSegment(j);
                // Console.WriteLine("***ZSS.Trunc:  removing file {0}", s);
                if (File.Exists(s))
                {
                    File.Delete(s);
                }
            }

            // now, open the desired segment.  It must exist.
            CurrentSegment = diskNumber;

            // get a new temp file, try 3 times:
            for (int i = 0; i < 3; i++)
            {
                try
                {
                    _currentTempName = SharedUtilities.InternalGetTempFileName();
                    // move the .z0x file back to a temp name
                    File.Move(CurrentName, _currentTempName);
                    break; // workitem 12403
                }
                catch (IOException)
                {
                    if (i == 2)
                    {
                        throw;
                    }
                }
            }

            // open it
            _innerStream = new FileStream(_currentTempName, FileMode.Open);

            var r = _innerStream.Seek(offset, SeekOrigin.Begin);

            // workitem 10178
            Pathfinding.Ionic.Zip.SharedUtilities.Workaround_Ladybug318918(_innerStream);

            return(r);
        }