protected override CrcCalculatorStream CreatePart(int partnum) { if (partnum > 1 && internalStream != null) { if (currentPart != null) { currentPart.Crc = (uint)internalStream.Crc; } internalStream.Close(); internalStream.Dispose(); } string partName = GetPartName(partnum); // Create a new part PartialFile newPart = new PartialFile(partName, partSize, partnum, Position); Parts.Add(newPart); currentPart = newPart; // Create a new part positionInPart = 0; return(new CrcCalculatorStream(new FileStream(partName, mode, access), false)); }
private bool OpenPart(PartialFile part) { if (!File.Exists(part.Filename)) { return(false); } currentPart.Crc = (uint)internalStream.Crc; internalStream.Close(); internalStream.Dispose(); internalStream = new CrcCalculatorStream(new FileStream(part.Filename, mode, access), false); currentPart = part; positionInPart = 0; return(true); }
private bool OpenPart(PartialFile part) { if (!File.Exists(part.Filename)) { return(false); } if (_current != null) { _current.Close(); _current.Dispose(); } _current = new FileStream(part.Filename, FileMode.Open, FileAccess.Read); _currentPart = part; positionInPart = 0; return(true); }
private void Initialize() { Parts = new List <PartialFile>(); // Check if file .z01 exists if (isReading) { FindParts(); currentPart = Parts.First(); string path = currentPart.Filename; isMultipart = amountOfParts > 1; internalStream = new CrcCalculatorStream(new FileStream(path, mode, access), false); } else { isMultipart = Interaction.Instance.MultiPart; internalStream = CreatePart(1); } }
public override long Seek(long offset, SeekOrigin origin) { // Find the correct part long offsetFromStart = 0; switch (origin) { case SeekOrigin.Begin: offsetFromStart = offset; break; case SeekOrigin.Current: offsetFromStart = Position + offset; break; case SeekOrigin.End: offsetFromStart = length + offset; break; } // Use this to calculate the correct file PartialFile part = FindPartAt(offsetFromStart); Debug.WriteLine("Seeking to {0} from {1}, found in part {2}, currentpart {3}", offset, origin, part.Number, currentPart.Number); if (!currentPart.Equals(part)) { if (!OpenPart(part)) { positionInPart = currentPart.Length; internalStream.Seek(0, SeekOrigin.End); _position = currentPart.StartPosition + currentPart.Length; return(_position); } } positionInPart = offsetFromStart - currentPart.StartPosition; internalStream.Seek(positionInPart, SeekOrigin.Begin); _position = offsetFromStart; return(_position); }
public override void Close() { base.Close(); if (!isMultipart || Parts.Count != 1) { return; } // Started as multipart, but it's only one! Let's rename it isMultipart = false; string newFile = GetPartName(1); PartialFile p = Parts.First(); if (File.Exists(newFile)) { File.Delete(newFile); } File.Move(p.Filename, newFile); p.Filename = newFile; }
public override long Seek(long offset, SeekOrigin origin) { long offsetFromStart = 0; switch (origin) { case SeekOrigin.Begin: offsetFromStart = offset; break; case SeekOrigin.Current: offsetFromStart = Position + offset; break; case SeekOrigin.End: offsetFromStart = length + offset; break; } // Use this to calculate the correct file PartialFile part = FindPartAt(offsetFromStart); if (!_currentPart.Equals(part)) { if (!OpenPart(part)) { positionInPart = _currentPart.Length; _current.Seek(0, SeekOrigin.End); _position = _currentPart.StartPosition + _currentPart.Length; return(_position); } } positionInPart = offsetFromStart - _currentPart.StartPosition; _current.Seek(positionInPart, SeekOrigin.Begin); _position = offsetFromStart; return(_position); }