Exemple #1
0
        public override void SetLength(long value)
        {
            long desiredNumClusters = (value + _reader.ClusterSize - 1) / _reader.ClusterSize;
            long actualNumClusters  = (_length + _reader.ClusterSize - 1) / _reader.ClusterSize;

            if (desiredNumClusters < actualNumClusters)
            {
                uint cluster;
                if (!TryGetClusterByPosition(value, out cluster))
                {
                    throw new IOException("Internal state corrupt - unable to find cluster");
                }

                uint firstToFree = _fat.GetNext(cluster);
                _fat.SetEndOfChain(cluster);
                _fat.FreeChain(firstToFree);

                while (_knownClusters.Count > desiredNumClusters)
                {
                    _knownClusters.RemoveAt(_knownClusters.Count - 1);
                }

                _knownClusters.Add(FatBuffer.EndOfChain);

                if (desiredNumClusters == 0)
                {
                    FireFirstClusterAllocated(0);
                }
            }
            else if (desiredNumClusters > actualNumClusters)
            {
                uint cluster;
                while (!TryGetClusterByPosition(value, out cluster))
                {
                    cluster = ExtendChain();
                    _reader.WipeCluster(cluster);
                }
            }

            if (_length != value)
            {
                _length = (uint)value;
                if (_position > _length)
                {
                    _position = _length;
                }
            }
        }