bool enstfilecache::readdata(t_int64 paddressoffset, t_int8* pdata, int pdatalength){ int datareaded = 0; do { int datacanread = mreadmappingoffset + mmappingviewsize - paddressoffset - datareaded; if (mreadbuffer && (datacanread <= 0 || datacanread > mmappingviewsize)) { unmapviewoffile(mreadbuffer); mreadbuffer = null; } if (mreadbuffer == null) { mreadmappingoffset = (paddressoffset + datareaded) / mmappingviewsize * mmappingviewsize; mreadbuffer = mapviewoffile(mmappinghandle, file_map_read, (dword)(mreadmappingoffset>>32), (dword)(mreadmappingoffset & 0xffffffff), mmappingviewsize); datacanread = mreadmappingoffset + mmappingviewsize - paddressoffset - datareaded; if (! mreadbuffer) { dumpwindowserrormessage(); enstlogservice *logservice = enstlogservice::getmyaddr(); logservice->appendlog(this, "error when map view of file."); return false; } } int datatoread = pdatalength - datareaded; int actualdatatoread = (datacanread >= datatoread)?datatoread:datacanread; memcpy((pbyte)pdata+datareaded, (pbyte)mreadbuffer+paddressoffset-mreadmappingoffset+datareaded, actualdatatoread); datareaded += actualdatatoread; } while (datareaded < pdatalength); return true;}void enstfilecache::dumpwindowserrormessage(){ lpvoid lpmsgbuf; dword dw = getlasterror(); formatmessage( format_message_allocate_buffer | format_message_from_system, null, dw, makelangid(lang_neutral, sublang_default), (lptstr) &lpmsgbuf, 0, null ); enstlogservice *logservice = enstlogservice::getmyaddr(); logservice->appendlog(this, (lptstr)lpmsgbuf); //puts((lptstr)lpmsgbuf); localfree(lpmsgbuf);}#ifdef win32 #include "moc_enstfilecache.cpp"#endif由于系统是用qt开发的,因此类中使用了不少qt的类,同时也使用了系统中的部分工具类,不过基本工作原理相信你是能够看懂的。另外,整个系统是计划要跨平台使用的,因此今后还需要实现linux下的类似功能,目前这个版本被绑定在windows平台上了,不幸。