Exemple #1
0
        void Copy(BlockReader reader, Func <IDataChunk, byte[]> payload)
        {
            byte[] data;
            while (reader.CurrentChunk != null && null != (data = payload(reader.CurrentChunk)))
            {
                if (data.Length > 0)
                {
                    target.Write(reader.CurrentChunk, data);
                }

                reader.Read();
                CancellationToken.ThrowIfCancellationRequested();
            }
        }
Exemple #2
0
        static void Read()
        {
            using (var stream = new FileStream("75268096", FileMode.Open, FileAccess.Read, FileShare.Read, Constants.BlockSize /* , FileOptions.DeleteOnClose */))
            {
                var reader = new BlockReader(stream);
                reader.Position = 75268096;

                //reader.Position = 105810828;
                //reader.Position = 105810830;

                var list = new List <Packet>();

                var watch = Stopwatch.StartNew();
                while (reader.Read())
                {
                    //list.Add(reader.Packet);
                }
                watch.Stop();
                Console.WriteLine(watch.ElapsedMilliseconds);

                watch.Restart();

                int skip = 0;

                var fileSize = stream.Length;
                for (long pos = fileSize / 5 * 4; pos < fileSize; pos++)
                {
                    reader.Seek(pos);
                    reader.Read();


                    skip += 1791;
                    if (skip > 10000)
                    {
                        skip = 0;
                    }
                    pos += skip;
                }

                watch.Stop();
                Console.WriteLine(watch.ElapsedMilliseconds);
            }
        }
Exemple #3
0
        private void Open()
        {
            var options = FileOptions.None;

            if (DeleteOnClose)
            {
                options |= FileOptions.DeleteOnClose;
            }

            if (CanWrite)
            {
                if (LowestAllowedOffset != 0 || HighestAllowedOffset != 0)
                {
                    throw new InvalidOperationException($"{nameof(LowestAllowedOffset)} and {nameof(HighestAllowedOffset)} must be zero.");
                }

                writerStream = new FileStream(FileName, FileMode.CreateNew, FileAccess.Write, FileShare.Read | FileShare.Delete, Constants.BlockSize, options);
                writer       = new BlockWriter(writerStream);
            }

            readerStream = OpenRead();

            if (HighestAllowedOffset == 0)
            {
                HighestAllowedOffset = readerStream.Length;
            }

            reader = new BlockReader(readerStream)
            {
                HighestAllowedOffset = HighestAllowedOffset
            };

            BlockIterator = new CachedBlockIterator(reader);

            FileLength = HighestAllowedOffset;
        }
        } = -1;                                                  // highest valid block in the file

        public CachedBlockIterator(BlockReader reader)
        {
            Reader = reader;
        }