Пример #1
0
        }                                                           //创建时间;

        public virtual Stream GetStream(bool isReadOnly = true)
        {
            var part = this.GetParent <Partition>();

            if (part == null)
            {
                Logger.WriteCallerLine($"{nameof(part)} can't be null!");
            }

            //若块组不为空,则取所有的块字段流;
            if (BlockGroups != null)
            {
                if (part != null)
                {
                    var blockSize  = part.ClusterSize;
                    var partStream = part.GetStream();
                    //若块组不为空,则遍历块组组成虚拟流;

                    var ranges = BlockGroups.Select(p =>
                                                    ValueTuple.Create(
                                                        p.BlockAddress * blockSize,
                                                        p.Count * blockSize)).ToArray();

                    var blockSub = ranges.Sum(p => p.Item2) - Size;
                    if (ranges?.Count() > 0 && 0 < blockSub && blockSub < blockSize)
                    {
                        ranges[ranges.Count() - 1].Item2 -= blockSub;
                    }
                    var multiStream = MulPeriodsStream.CreateFromStream(partStream, ranges);
                    return(multiStream);
                }
            }
            //否则直接取连续的流;
            else
            {
                var blockSize = part.ClusterSize;

                var partStream = part.GetStream();
                if (partStream != null)
                {
                    var fiStream = InterceptStream.CreateFromStream(partStream, StartLBA, Size);
                    //var buffer = new byte[128];
                    //var read = fiStream.Read(buffer, 0, buffer.Length);
                    return(fiStream);
                }
            }
            return(null);
        }