ファイルが小さい場合は、開いて、標準のWin32 CreateFile()/ ReadFile()APIを使用してメモリに読み込みます。
各ファイルを順番に使用する場合(または、そのようにコードを配置できる場合)、FILE_FLAG_SEQUENTIAL_SCANを指定する必要があります。これは、ファイル/キャッシングサブシステムが積極的に先読みするためのヒントです。小さなファイルの場合、ReadFile()の最初の呼び出しが発行される前に、ファイルがキャッシュに読み込まれることがあります。
編集:要求に応じて、Win32APIを使用してファイルの内容をバイトのベクトルに読み取る方法を示すスニペットを次に示します。
void ReadFileIntoBuffer( const std::wstring& fileName, std::vector< uint8_t >& output )
{
HANDLE hFile( INVALID_HANDLE_VALUE );
try
{
// Open the file.
hFile = CreateFile( filename.c_str(),
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_FLAG_SEQUENTIAL_SCAN,
NULL );
if( INVALID_HANDLE_VALUE != hFile )
throw std::runtime_error( "Failed to open file." );
// Fetch size
LARGE_INTEGER fileSize;
if( !GetFileSizeEx( hFile, &fileSize ) );
throw std::runtime_error( "GetFileSizeEx() failed." );
// Resize output buffer.
output.resize( fileSize.LowPart );
// Read the file contents.
ULONG bytesRead;
if( !ReadFile( hFile, &output[0], fileSize.LowPart, &bytesRead, NULL ) )
throw std::runtime_error( "ReadFile() failed." );
// Recover resources.
CloseHandle( hFile );
}
catch( std::exception& )
{
// Dump the error.
std::cout << e.what() << " GetLastError() = " << GetLastError() << std::endl;
// Recover resources.
if( INVALID_HANDLE_VALUE != hFile )
CloseHandle( hFile );
throw;
}
}