如果文件很小,只需打開並使用標準的Win32 CreateFile()/ ReadFile()API將它們讀入內存。
如果您按順序使用每個文件(或者可以按照您的方式排列代碼),則應該指定FILE_FLAG_SEQUENTIAL_SCAN。這是文件/緩存子系統積極預讀的提示。對於小文件,在第一次調用ReadFile()之前,該文件可能會被讀入緩存中。
編輯:按照要求,下面是說明讀取文件的內容到使用Win32 API字節的載體的片段:
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;
}
}
請記住,磁盤I/O是許多訂單幅度比內存I/O慢。 –