public static Task <byte[]> ReadAllBytesAsync(string path, CancellationToken cancellationToken = default(CancellationToken)) { if (cancellationToken.IsCancellationRequested) { return(Task.FromCanceled <byte[]>(cancellationToken)); } // SequentialScan is a perf hint that requires extra sys-call on non-Windows OSes. FileOptions options = FileOptions.Asynchronous | (OperatingSystem.IsWindows() ? FileOptions.SequentialScan : FileOptions.None); SafeFileHandle sfh = OpenHandle(path, FileMode.Open, FileAccess.Read, FileShare.Read, options); long fileLength = 0L; if (sfh.CanSeek && (fileLength = sfh.GetFileLength()) > Array.MaxLength) { sfh.Dispose(); return(Task.FromException <byte[]>(ExceptionDispatchInfo.SetCurrentStackTrace(new IOException(SR.IO_FileTooLong2GB)))); } #if DEBUG fileLength = 0; // improve the test coverage for InternalReadAllBytesUnknownLengthAsync #endif return(fileLength > 0 ? InternalReadAllBytesAsync(sfh, (int)fileLength, cancellationToken) : InternalReadAllBytesUnknownLengthAsync(sfh, cancellationToken)); }
public static byte[] ReadAllBytes(string path) { // SequentialScan is a perf hint that requires extra sys-call on non-Windows OSes. FileOptions options = OperatingSystem.IsWindows() ? FileOptions.SequentialScan : FileOptions.None; using (SafeFileHandle sfh = OpenHandle(path, FileMode.Open, FileAccess.Read, FileShare.Read, options)) { long fileLength = 0; if (sfh.CanSeek && (fileLength = sfh.GetFileLength()) > Array.MaxLength) { throw new IOException(SR.IO_FileTooLong2GB); } #if DEBUG fileLength = 0; // improve the test coverage for ReadAllBytesUnknownLength #endif if (fileLength == 0) { // Some file systems (e.g. procfs on Linux) return 0 for length even when there's content; also there are non-seekable files. // Thus we need to assume 0 doesn't mean empty. return(ReadAllBytesUnknownLength(sfh)); } int index = 0; int count = (int)fileLength; byte[] bytes = new byte[count]; while (count > 0) { int n = RandomAccess.ReadAtOffset(sfh, bytes.AsSpan(index, count), index); if (n == 0) { ThrowHelper.ThrowEndOfFileException(); } index += n; count -= n; } return(bytes); } }
/// <summary> /// Gets the length of the file in bytes. /// </summary> /// <param name="handle">The file handle.</param> /// <returns>A long value representing the length of the file in bytes.</returns> /// <exception cref="T:System.ArgumentNullException"><paramref name="handle" /> is <see langword="null" />.</exception> /// <exception cref="T:System.ArgumentException"><paramref name="handle" /> is invalid.</exception> /// <exception cref="T:System.ObjectDisposedException">The file is closed.</exception> /// <exception cref="T:System.NotSupportedException">The file does not support seeking (pipe or socket).</exception> public static long GetLength(SafeFileHandle handle) { ValidateInput(handle, fileOffset: 0); return(handle.GetFileLength()); }