Я читаю напрямую с диска, используя С# и вызывая метод ядра 32 ReadFile. Я заметил, что при больших операциях чтения (в настоящее время только при чтении отдельными порциями) размер буфера выходит за пределы допустимого диапазона.
Кто-нибудь знает максимальный размер буфера чтения здесь?
Если да, то какова цель ограничения размера буфера, когда у меня есть избыточная память, которую я хочу читать? Я понимаю концепции буферизации и сохранения небольшого объема памяти, но почему нам навязывают небольшой размер? Возможно, это просто артефакт старого Win32 API?
РЕДАКТИРОВАТЬ: ошибка, полученная от Marshal.GetLastWin32Error()
: «Значение не попадает в ожидаемый диапазон».
Верхний предел, прежде чем я получу эту ошибку, составляет 8192 байта (8 КБ - отсюда и мое замешательство).
using System;
using System.IO;
using System.Runtime.InteropServices;
using Microsoft.Win32.SafeHandles;
namespace DiskRead
{
class Program
{
public const uint GenericRead = 0x80000000;
public const uint FileShareRead = 1;
public const uint FileShareWrite = 2;
public const uint OpenExisting = 3;
[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
private static extern IntPtr CreateFile(string lpFileName, uint dwDesiredAccess,
uint dwShareMode, IntPtr lpSecurityAttributes, uint dwCreationDisposition,
uint dwFlagsAndAttributes, IntPtr hTemplateFile);
[DllImport("kernel32.dll", SetLastError = true)]
static extern bool ReadFile(IntPtr hFile, [Out] byte[] lpBuffer,
uint nNumberOfBytesToRead, out uint lpNumberOfBytesRead, IntPtr lpOverlapped);
static void Main(string[] args)
{
string path = @"\\.\PhysicalDrive0";
IntPtr ptr = CreateFile(path, GenericRead, FileShareRead | FileShareWrite, IntPtr.Zero, OpenExisting, 0, IntPtr.Zero);
SafeFileHandle handleValue = new SafeFileHandle(ptr, true);
FileStream fileStream = new FileStream(handleValue, FileAccess.Read);
const uint numberOfBytesToRead = 8193;
uint bytesRead;
byte[] buffer = new byte[numberOfBytesToRead];
if (!ReadFile(handleValue.DangerousGetHandle(), buffer, numberOfBytesToRead, out bytesRead, IntPtr.Zero))
{
Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error());
}
}
}
}
Заранее спасибо.