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(); } }
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); } }
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; }