Пример #1
0
        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));
        }
Пример #2
0
        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);
        }
Пример #3
0
        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);
        }
Пример #4
0
        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);
            }
        }
Пример #5
0
        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);
        }
Пример #6
0
        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;
        }
Пример #7
0
        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);
        }