Exemplo n.º 1
0
        public async Task<FileIndexSeekResult> SeekAsync(int index)
        {
            var result = new FileIndexSeekResult();

            if (!FilesExist || index < 0 || index >= Length)
            {
                return FileIndexSeekResult.None;
            }

            var e = Entries[index];

            if (e.Lookup < 0 || e.Length <= 0)
            {
                return FileIndexSeekResult.None;
            }

            var length = result.Length = e.Length & 0x7FFFFFFF;

            result.Extra = e.Extra;

            using (await _asyncLock.LockAsync())
            {
                if (Stream != null && (!Stream.CanRead || !Stream.CanSeek))
                {
                    Stream.Dispose();
                    Stream = null;
                }

                if (Stream == null)
                {
                    Stream = new FileStream(DataPath, FileMode.Open, FileAccess.Read, FileShare.Read);
                }

                Stream.Seek(e.Lookup, SeekOrigin.Begin);

                result.Stream = new MemoryStream();

                for (var offset = 0; offset < length; offset += _copyBuffer.Length)
                {
                    var count = Math.Min(_copyBuffer.Length, length);
                    var numBytesRead = await Stream.ReadAsync(_copyBuffer, offset, count).ConfigureAwait(false);

                    await result.Stream.WriteAsync(_copyBuffer, offset, numBytesRead).ConfigureAwait(false);
                }

                result.Stream.Position = 0;

                return result;
            }
        }
Exemplo n.º 2
0
        public async Task <FileIndexSeekResult> SeekAsync(int index)
        {
            var result = new FileIndexSeekResult();

            if (!FilesExist || index < 0 || index >= Length)
            {
                return(FileIndexSeekResult.None);
            }

            var e = Entries[index];

            if (e.Lookup < 0 || e.Length <= 0)
            {
                return(FileIndexSeekResult.None);
            }

            var length = result.Length = e.Length & 0x7FFFFFFF;

            result.Extra = e.Extra;

            using (await _asyncLock.LockAsync())
            {
                if (Stream != null && (!Stream.CanRead || !Stream.CanSeek))
                {
                    Stream.Dispose();
                    Stream = null;
                }

                if (Stream == null)
                {
                    Stream = new FileStream(DataPath, FileMode.Open, FileAccess.Read, FileShare.Read);
                }

                Stream.Seek(e.Lookup, SeekOrigin.Begin);

                result.Stream = new MemoryStream();

                for (var offset = 0; offset < length; offset += _copyBuffer.Length)
                {
                    var count        = Math.Min(_copyBuffer.Length, length);
                    var numBytesRead = await Stream.ReadAsync(_copyBuffer, offset, count).ConfigureAwait(false);

                    await result.Stream.WriteAsync(_copyBuffer, offset, numBytesRead).ConfigureAwait(false);
                }

                result.Stream.Position = 0;

                return(result);
            }
        }