/// <summary> /// Non rented array input, Array is Input /// </summary> /// <param name="array"></param> /// <param name="readLength"></param> public ReadResult(byte[] array, int readLength) { if (array is null) { ThrowHelpers.ByteArrayCannotBeNull(); } if ((uint)readLength > (uint)array.Length) { ThrowHelpers.ReadLengthCannotBeOutOfBounds(); } Array = array; Source = null; ReadLength = readLength; IsArrayRented = false; ShouldDisposeStream = false; ShouldResetStreamPosition = false; }
/// <summary> /// Reads the file header - first (16) bytes from the file /// </summary> /// <param name="file">The file to work with</param> /// <returns>Array of bytes</returns> public static ReadResult ReadFileHeader(FileInfo file) { if (file is null) { ThrowHelpers.FileInfoCannotBeNull(); } if (!file.Exists) { ThrowHelpers.FileDoesNotExist(file); } FileStream fileStream = file.OpenRead(); byte[] header = ArrayPool <byte> .Shared.Rent(MimeTypes.MaxHeaderSize); int bytesRead = fileStream.Read(header, 0, MimeTypes.MaxHeaderSize); return(new ReadResult(header, fileStream, bytesRead, isArrayRented: true, shouldDisposeStream: true, shouldResetStreamPosition: false)); }
//TODO Figure out how to handle non-seekable Streams /// <summary> /// Takes a stream does, not dispose of stream, resets read position to beginning though /// </summary> /// <param name="stream"></param> /// <param name="MaxHeaderSize"></param> /// <returns></returns> public static async Task <ReadResult> ReadHeaderFromStreamAsync(Stream stream, bool shouldDisposeStream = false, bool shouldResetStreamPosition = true) { if (stream is null) { ThrowHelpers.StreamCannotBeNull(); } if (!stream.CanRead) { ThrowHelpers.CannotReadFromStream(); } if (stream.CanSeek && stream.Position > 0) { stream.Seek(0, SeekOrigin.Begin); } byte[] header = ArrayPool <byte> .Shared.Rent(MimeTypes.MaxHeaderSize); int bytesRead = await stream.ReadAsync(header, 0, MimeTypes.MaxHeaderSize); return(new ReadResult(header, stream, bytesRead, isArrayRented: true, shouldDisposeStream, shouldResetStreamPosition)); }