如果文件很小,只需打开并使用标准的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慢。 –