简单之文件存储管理

来源:互联网 发布:将centos系统备份 编辑:程序博客网 时间:2024/05/05 23:24

        别尝试在单个机械硬盘上做并行设计~


XXXXXXXX.h

//######################//> /*数据结构*///######################*********************************************************************************************************/#pragma pack(1)//> 最大缓冲区大小#define MAX_BUFFER_SIZE (500U)//> 文件存储结构typedef struct _FILE_AREA_INFO {DWORD dwGroupIndex;  //组索引DWORD dwItemIndex;   //成员索引USHORT uActualSize;     //实际写入缓冲区大小UCHAR uBuffer[MAX_BUFFER_SIZE]; //数据缓冲区USHORT uIsDelete;    //标记是否被删除} FILE_AREA_INFO, *PFILE_AREA_INFO;//> 最大缓存总数#define MAX_CACHE_COUNT (8192U)//> 文件缓存信息typedef struct _FILE_CACHE_INFO {USHORT uCurOperationL;          //当前在操作左轮PFILE_AREA_INFO lpTurnsCacheL;  //左轮缓存区指针USHORT uCurOperationR;          //当前在操作右轮PFILE_AREA_INFO lpTurnsCacheR;  //右轮缓存区指针DWORD dwFileToCacheCount;             //缓存总数PFILE_AREA_INFO lpTurnsFileToCache;   //写入文件的临时缓存区DWORD dwCacheToFileCount;             //写入总数PFILE_AREA_INFO lpTurnsCacheToFile;   //将要写入文件的缓存区} FILE_CACHE_INFO, *PFILE_CACHE_INFO;//> 多少成员总数为一个组#define MAX_ITEM_COUNT (4096U)//> 文件基本信息typedef struct _FILE_INFO {/**文件信息**/HANDLE hSpecFile;     //文件快句柄DWORD dwGroupCount;   //组总数DWORD dwGroupIndex;   //组索引DWORD dwItemCount;    //成员总数DWORD dwItemIndex;    //成员索引/**缓存信息**/LPVOID lpFindBuffer;  //查找缓冲区FILE_CACHE_INFO lpCacheInfo;  //缓存信息} FILE_INFO, *PFILE_INFO;//> 文件头信息typedef struct _FILE_HEADER_INFO {DWORD dwGroupCount;   //组总数DWORD dwGroupIndex;   //组索引DWORD dwItemCount;    //成员总数DWORD dwItemIndex;    //成员索引} FILE_HEADER_INFO, *PFILE_HEADER_INFO;#pragma pack()/*************************************************************************************************************************///######################//> /*全局变量*///######################*********************************************************************************************************///> 文件总数#define MAX_FILE_COUNT (1U)//> 全局文件信息extern PFILE_INFO G_FileInfo;/*************************************************************************************************************************///######################//> /*操作函数*///######################*********************************************************************************************************///> 分配指定数量的文件信息空间BOOLEAN __fastcall AllocFileInfo(DWORD dwFileCount);//> 释放指定数量的文件信息空间VOID __fastcall FreeFileInfo(VOID);//> 分配查找缓冲区空间BOOLEAN __fastcall AllocBufferInfo(DWORD dwIndex, DWORD dwBufferSize);//> 释放查找缓冲区空间VOID __fastcall FreeBufferInfo(DWORD dwIndex);//> 分配指定文件缓存信息空间BOOLEAN __fastcall AllocCacheInfo(DWORD dwIndex, DWORD dwCacheCount);//> 释放指定文件缓存信息空间VOID __fastcall FreeCacheInfo(DWORD dwIndex);//> 设置左轮缓存区为默认缓存区VOID __fastcall SetFileToCacheL(DWORD dwIndex);//> 设置右轮缓存区为默认缓存区VOID __fastcall SetFileToCacheR(DWORD dwIndex);//> 刷新缓存区并写入文件BOOLEAN __fastcall FlushFileCache(DWORD dwIndex);//> 返回可读写的新数据索引VOID __fastcall GetContentsIndex(DWORD dwIndex, DWORD * lpGroupIndex, DWORD * lpItemIndex);//> 查找需要读写的数据索引BOOLEAN __stdcall FindContentsIndex(DWORD dwIndex, LPCVOID lpBuffer, USHORT uBufSize, DWORD * lpGroupIndex, DWORD * lpItemIndex);//> 是否是被删除的数据BOOLEAN __stdcall IsDeleteContentsIndex(DWORD dwIndex, DWORD dwGroupIndex, DWORD dwItemIndex);//> 删除指定的数据BOOLEAN __stdcall DeleteContentsIndex(DWORD dwIndex, DWORD dwGroupIndex, DWORD dwItemIndex);//> 恢复指定的数据BOOLEAN __stdcall RecoveryContentsIndex(DWORD dwIndex, DWORD dwGroupIndex, DWORD dwItemIndex);//> 绑定指定的文件索引BOOLEAN __stdcall BindFileToIndex(DWORD dwIndex, CONST WCHAR wzFilePath[], USHORT uPathSize);//> 写入指定的文件内容BOOLEAN __stdcall WriteFileIndex(DWORD dwIndex, DWORD dwGroupIndex, DWORD dwItemIndex, LPCVOID lpBuffer, USHORT * lpBufSize);//> 读入指定的文件内容BOOLEAN __stdcall ReadFileIndex(DWORD dwIndex, DWORD dwGroupIndex, DWORD dwItemIndex, LPVOID lpBuffer, USHORT * lpBufSize);//> 关闭指定的文件BOOLEAN __fastcall CloseFileIndex(DWORD dwIndex);/*************************************************************************************************************************/


XXXXXXXX.cpp

#include "stdafx.h"#include "StorageFrameBase.h"PFILE_INFO G_FileInfo = NULL;/******************************************功能:分配指定数量的文件信息空间参数:dwFileCount 文件总数返回:TRUE则成功******************************************/BOOLEAN __fastcall AllocFileInfo(DWORD dwFileCount){G_FileInfo = (PFILE_INFO)::HeapAlloc(::GetProcessHeap(), HEAP_ZERO_MEMORY, (dwFileCount * sizeof(FILE_INFO)));if (NULL == G_FileInfo){return FALSE;}return TRUE;}/******************************************功能:释放指定数量的文件信息空间参数:无返回:无******************************************/VOID __fastcall FreeFileInfo(VOID){if (NULL != G_FileInfo){if (TRUE == ::HeapFree(::GetProcessHeap(), HEAP_NO_SERIALIZE, G_FileInfo)){G_FileInfo = NULL;}}}/******************************************功能:分配查找缓冲区空间参数:dwIndex 文件索引参数:dwBufferSize 文件总数返回:TRUE则成功******************************************/BOOLEAN __fastcall AllocBufferInfo(DWORD dwIndex, DWORD dwBufferSize){G_FileInfo[dwIndex].lpFindBuffer = (LPVOID)::HeapAlloc(::GetProcessHeap(), HEAP_ZERO_MEMORY, (dwBufferSize * sizeof(FILE_AREA_INFO)));if (NULL == G_FileInfo[dwIndex].lpFindBuffer){return FALSE;}return TRUE;}/******************************************功能:释放查找缓冲区空间参数:dwIndex 文件索引返回:无******************************************/VOID __fastcall FreeBufferInfo(DWORD dwIndex){if (NULL != G_FileInfo[dwIndex].lpFindBuffer){if (TRUE == ::HeapFree(::GetProcessHeap(), HEAP_NO_SERIALIZE, G_FileInfo[dwIndex].lpFindBuffer)){G_FileInfo[dwIndex].lpFindBuffer = NULL;}}}/******************************************功能:分配指定文件缓存信息空间参数:dwIndex 文件索引参数:dwCacheCount 缓存总数返回:TRUE则成功******************************************/BOOLEAN __fastcall AllocCacheInfo(DWORD dwIndex, DWORD dwCacheCount){PFILE_AREA_INFO lpFileAreaInfo;lpFileAreaInfo = (PFILE_AREA_INFO)::HeapAlloc(::GetProcessHeap(), HEAP_ZERO_MEMORY, (dwCacheCount * sizeof(FILE_AREA_INFO)));if (NULL == lpFileAreaInfo){return FALSE;}G_FileInfo[dwIndex].lpCacheInfo.lpTurnsCacheL = &lpFileAreaInfo[0];G_FileInfo[dwIndex].lpCacheInfo.lpTurnsCacheR = &lpFileAreaInfo[(dwCacheCount / 2U)];return TRUE;}/******************************************功能://> 设置左轮缓存区为默认缓存区参数:dwIndex 文件索引返回:无******************************************/VOID __fastcall SetFileToCacheL(DWORD dwIndex){G_FileInfo[dwIndex].lpCacheInfo.lpTurnsFileToCache = G_FileInfo[dwIndex].lpCacheInfo.lpTurnsCacheL;G_FileInfo[dwIndex].lpCacheInfo.uCurOperationL = TRUE;}/******************************************功能://> 设置右轮缓存区为默认缓存区参数:dwIndex 文件索引返回:无******************************************/VOID __fastcall SetFileToCacheR(DWORD dwIndex){G_FileInfo[dwIndex].lpCacheInfo.lpTurnsFileToCache = G_FileInfo[dwIndex].lpCacheInfo.lpTurnsCacheR;G_FileInfo[dwIndex].lpCacheInfo.uCurOperationR = TRUE;}/******************************************功能:释放指定文件缓存信息空间参数:dwIndex 文件索引返回:无******************************************/VOID __fastcall FreeCacheInfo(DWORD dwIndex){if (G_FileInfo[dwIndex].lpCacheInfo.lpTurnsCacheL != NULL){if (TRUE == ::HeapFree(::GetProcessHeap(), HEAP_NO_SERIALIZE, G_FileInfo[dwIndex].lpCacheInfo.lpTurnsCacheL)){memset(&G_FileInfo[dwIndex].lpCacheInfo, 0U, sizeof(FILE_CACHE_INFO));}}}/******************************************功能:读取文件头索引信息参数:dwIndex 文件信息索引返回:TRUE则成功******************************************/static BOOLEAN __fastcall ReadFileHeader(DWORD dwIndex){DWORD dwActualSize;FILE_HEADER_INFO FileHeadInfo;if (INVALID_SET_FILE_POINTER == ::SetFilePointer(G_FileInfo[dwIndex].hSpecFile, 0U, NULL, FILE_BEGIN)){return FALSE;}if (FALSE == ::ReadFile(G_FileInfo[dwIndex].hSpecFile, &FileHeadInfo, sizeof(FILE_HEADER_INFO), &dwActualSize, NULL)){return FALSE;}if (0U != dwActualSize){G_FileInfo[dwIndex].dwGroupCount = FileHeadInfo.dwGroupCount;G_FileInfo[dwIndex].dwGroupIndex = FileHeadInfo.dwGroupIndex;G_FileInfo[dwIndex].dwItemCount = FileHeadInfo.dwItemCount;G_FileInfo[dwIndex].dwItemIndex = FileHeadInfo.dwItemIndex;}return TRUE;}/******************************************功能:绑定指定的文件索引参数:dwIndex 文件信息索引参数:wzFilePath 文件的路径名参数:uPathSize 缓冲区大小返回:TRUE则成功******************************************/BOOLEAN __stdcall BindFileToIndex(DWORD dwIndex, CONST WCHAR wzFilePath[], USHORT uPathSize){if (TRUE == ::IsBadReadPtr(wzFilePath, uPathSize)){return FALSE;}G_FileInfo[dwIndex].hSpecFile = ::CreateFileW(wzFilePath, GENERIC_READ | GENERIC_WRITE, 0U, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_RANDOM_ACCESS, NULL);if (INVALID_HANDLE_VALUE == G_FileInfo[dwIndex].hSpecFile){G_FileInfo[dwIndex].hSpecFile = ::CreateFileW(wzFilePath,GENERIC_READ | GENERIC_WRITE, 0U, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_RANDOM_ACCESS, NULL);}if (INVALID_HANDLE_VALUE == G_FileInfo[dwIndex].hSpecFile){return FALSE;}return (ReadFileHeader(dwIndex));}/******************************************功能:设置将要写入文件的缓存区参数:dwIndex 文件索引参数:lpFileAreaInfo 指定缓存区指针参数:dwCacheToFileCount 缓存总数返回:无******************************************/static VOID __fastcall SetCacheToFileInfo(DWORD dwIndex, PFILE_AREA_INFO lpTurnsCacheToFile, DWORD dwCacheToFileCount){G_FileInfo[dwIndex].lpCacheInfo.lpTurnsCacheToFile = lpTurnsCacheToFile;G_FileInfo[dwIndex].lpCacheInfo.dwCacheToFileCount = dwCacheToFileCount;}/******************************************功能:将缓存数据写入硬盘文件参数:dwIndex 文件索引返回:TRUE则成功******************************************/static BOOLEAN __fastcall CacheCopyFile(DWORD dwIndex){LARGE_INTEGER FilePoint;for (register UINT uCacheIndex = 0U; uCacheIndex < G_FileInfo[dwIndex].lpCacheInfo.dwCacheToFileCount; ++uCacheIndex){FilePoint.QuadPart = MAX_ITEM_COUNT * G_FileInfo[dwIndex].lpCacheInfo.lpTurnsCacheToFile[uCacheIndex].dwGroupIndex;FilePoint.QuadPart = FilePoint.QuadPart + G_FileInfo[dwIndex].lpCacheInfo.lpTurnsCacheToFile[uCacheIndex].dwItemIndex;FilePoint.QuadPart = FilePoint.QuadPart * sizeof(FILE_AREA_INFO);FilePoint.QuadPart = FilePoint.QuadPart + sizeof(FILE_HEADER_INFO);if (INVALID_SET_FILE_POINTER == ::SetFilePointer(G_FileInfo[dwIndex].hSpecFile, FilePoint.LowPart, &FilePoint.HighPart, FILE_BEGIN)){return FALSE;}if (FALSE == ::WriteFile(G_FileInfo[dwIndex].hSpecFile, &G_FileInfo[dwIndex].lpCacheInfo.lpTurnsCacheToFile[uCacheIndex], sizeof(FILE_AREA_INFO), &FilePoint.LowPart, NULL)){return FALSE;}}G_FileInfo[dwIndex].lpCacheInfo.dwCacheToFileCount = 0U;return TRUE;}/******************************************功能:设置将要临时存储的缓存区参数:dwIndex 文件索引参数:lpFileAreaInfo 指定缓存区指针参数:dwCacheToFileCount 缓存总数返回:无******************************************/static VOID __fastcall SetFileToCacheInfo(DWORD dwIndex, PFILE_AREA_INFO lpTurnsFileToCache, DWORD dwFileToCacheCount){G_FileInfo[dwIndex].lpCacheInfo.lpTurnsFileToCache = lpTurnsFileToCache;G_FileInfo[dwIndex].lpCacheInfo.dwFileToCacheCount = dwFileToCacheCount;}/******************************************功能:写入缓存区参数:dwIndex 文件索引参数:dwGroupIndex 组索引参数:dwItemIndex 成员索引参数:lpBuffer 需要写入的数据参数:uBufSize 数据大小返回:TRUE则成功******************************************/static BOOLEAN __stdcall FileCopyCache(DWORD dwIndex, DWORD dwGroupIndex, DWORD dwItemIndex, LPCVOID lpBuffer, USHORT uBufSize){if (0U != G_FileInfo[dwIndex].lpCacheInfo.lpTurnsFileToCache[dwItemIndex].uActualSize){if (dwGroupIndex == G_FileInfo[dwIndex].lpCacheInfo.lpTurnsFileToCache[dwItemIndex].dwGroupIndex){G_FileInfo[dwIndex].lpCacheInfo.lpTurnsFileToCache[dwItemIndex].uActualSize = uBufSize;memcpy(G_FileInfo[dwIndex].lpCacheInfo.lpTurnsFileToCache[dwItemIndex].uBuffer, lpBuffer, uBufSize);}else{CONST DWORD dwCurIndex = G_FileInfo[dwIndex].lpCacheInfo.dwFileToCacheCount;G_FileInfo[dwIndex].lpCacheInfo.dwFileToCacheCount++;G_FileInfo[dwIndex].lpCacheInfo.lpTurnsFileToCache[dwCurIndex].dwGroupIndex = dwGroupIndex;G_FileInfo[dwIndex].lpCacheInfo.lpTurnsFileToCache[dwCurIndex].dwItemIndex = dwItemIndex;G_FileInfo[dwIndex].lpCacheInfo.lpTurnsFileToCache[dwCurIndex].uActualSize = uBufSize;memcpy(G_FileInfo[dwIndex].lpCacheInfo.lpTurnsFileToCache[dwCurIndex].uBuffer, lpBuffer, uBufSize);}}if (0U == G_FileInfo[dwIndex].lpCacheInfo.lpTurnsFileToCache[dwItemIndex].uActualSize){G_FileInfo[dwIndex].lpCacheInfo.dwFileToCacheCount++;G_FileInfo[dwIndex].lpCacheInfo.lpTurnsFileToCache[dwItemIndex].dwGroupIndex = dwGroupIndex;G_FileInfo[dwIndex].lpCacheInfo.lpTurnsFileToCache[dwItemIndex].dwItemIndex = dwItemIndex;G_FileInfo[dwIndex].lpCacheInfo.lpTurnsFileToCache[dwItemIndex].uActualSize = uBufSize;memcpy(G_FileInfo[dwIndex].lpCacheInfo.lpTurnsFileToCache[dwItemIndex].uBuffer, lpBuffer, uBufSize);}return TRUE;}/******************************************功能:交替轮流作用缓存区参数:dwIndex 文件索引返回:TRUE则数据发生交换******************************************/static BOOLEAN __fastcall SwitchTurnsCache(DWORD dwIndex){CONST DWORD dwFileToCacheCount = G_FileInfo[dwIndex].lpCacheInfo.dwFileToCacheCount;if ((MAX_CACHE_COUNT / 2U) == dwFileToCacheCount){if (TRUE == G_FileInfo[dwIndex].lpCacheInfo.uCurOperationL){SetFileToCacheInfo(dwIndex, G_FileInfo[dwIndex].lpCacheInfo.lpTurnsCacheR,0U);SetCacheToFileInfo(dwIndex, G_FileInfo[dwIndex].lpCacheInfo.lpTurnsCacheL, dwFileToCacheCount);G_FileInfo[dwIndex].lpCacheInfo.uCurOperationL = FALSE;G_FileInfo[dwIndex].lpCacheInfo.uCurOperationR = TRUE;return TRUE;}if (TRUE == G_FileInfo[dwIndex].lpCacheInfo.uCurOperationR){SetFileToCacheInfo(dwIndex, G_FileInfo[dwIndex].lpCacheInfo.lpTurnsCacheL, 0U);SetCacheToFileInfo(dwIndex, G_FileInfo[dwIndex].lpCacheInfo.lpTurnsCacheR, dwFileToCacheCount);G_FileInfo[dwIndex].lpCacheInfo.uCurOperationR = FALSE;G_FileInfo[dwIndex].lpCacheInfo.uCurOperationL = TRUE;return TRUE;}}return FALSE;}/******************************************功能:写入指定的文件内容参数:dwIndex 文件索引参数:dwGroupIndex 组索引参数:dwItemIndex 成员索引参数:lpBuffer 需要写入的数据参数:lpBufSize 写入实际大小返回:TRUE则成功******************************************/BOOLEAN __stdcall WriteFileIndex(DWORD dwIndex, DWORD dwGroupIndex, DWORD dwItemIndex, LPCVOID lpBuffer, USHORT * lpBufSize){BOOLEAN bWriteCache;BOOLEAN bSwitchCache;if (0U == *lpBufSize || TRUE == ::IsBadReadPtr(lpBuffer, *lpBufSize) || dwItemIndex >= MAX_ITEM_COUNT){return FALSE;}if (*lpBufSize > MAX_BUFFER_SIZE){*lpBufSize = MAX_BUFFER_SIZE;}bSwitchCache = SwitchTurnsCache(dwIndex);bWriteCache = FileCopyCache(dwIndex, dwGroupIndex, dwItemIndex, lpBuffer, *lpBufSize);if (TRUE == bSwitchCache){return (CacheCopyFile(dwIndex));}return (bWriteCache);}/******************************************功能:在缓存区读取数据参数:dwIndex 文件索引参数:dwGroupIndex 组索引参数:dwItemIndex 成员索引参数:lpBuffer 需要读入的缓冲区参数:lpBufSize 读入实际大小返回:TRUE则成功******************************************/static BOOLEAN __stdcall ReadCacheToBuffer(DWORD dwIndex, DWORD dwGroupIndex, DWORD dwItemIndex, LPVOID lpBuffer, USHORT * lpBufSize){ if (0U != G_FileInfo[dwIndex].lpCacheInfo.lpTurnsFileToCache[dwItemIndex].uActualSize &&  dwGroupIndex == G_FileInfo[dwIndex].lpCacheInfo.lpTurnsFileToCache[dwItemIndex].dwGroupIndex) {  *lpBufSize = G_FileInfo[dwIndex].lpCacheInfo.lpTurnsFileToCache[dwItemIndex].uActualSize;  memcpy(lpBuffer, G_FileInfo[dwIndex].lpCacheInfo.lpTurnsFileToCache[dwItemIndex].uBuffer, *lpBufSize);  return TRUE; }
 for (register UINT uFindIndex = dwItemIndex + 1U; uFindIndex < G_FileInfo[dwIndex].lpCacheInfo.dwFileToCacheCount; ++uFindIndex) {  if (dwGroupIndex == G_FileInfo[dwIndex].lpCacheInfo.lpTurnsFileToCache[uFindIndex].dwGroupIndex &&   dwItemIndex == G_FileInfo[dwIndex].lpCacheInfo.lpTurnsFileToCache[uFindIndex].dwItemIndex)  {   *lpBufSize = G_FileInfo[dwIndex].lpCacheInfo.lpTurnsFileToCache[uFindIndex].uActualSize;   memcpy(lpBuffer, G_FileInfo[dwIndex].lpCacheInfo.lpTurnsFileToCache[uFindIndex].uBuffer, *lpBufSize);   return TRUE;  } } return FALSE;}
/******************************************功能:从硬盘文件中读取内容参数:dwIndex 文件索引参数:dwGroupIndex 组索引参数:dwItemIndex 成员索引参数:lpBuffer 需要读入的缓冲区参数:lpBufSize 读入实际大小返回:TRUE则成功******************************************/static BOOLEAN __stdcall ReadHardDriveFile(HANDLE hFile, DWORD dwGroupIndex, DWORD dwItemIndex, LPVOID lpBuffer, USHORT * lpBufSize){LARGE_INTEGER FilePoint;FILE_AREA_INFO FileAreaInfo;FilePoint.QuadPart = dwGroupIndex * MAX_ITEM_COUNT;FilePoint.QuadPart = FilePoint.QuadPart + dwItemIndex;FilePoint.QuadPart = FilePoint.QuadPart * sizeof(FILE_AREA_INFO);FilePoint.QuadPart = FilePoint.QuadPart + sizeof(FILE_HEADER_INFO);if (INVALID_SET_FILE_POINTER == ::SetFilePointer(hFile, FilePoint.LowPart, &FilePoint.HighPart, FILE_BEGIN)){return FALSE;}if (FALSE == ::ReadFile(hFile, &FileAreaInfo, sizeof(FileAreaInfo), &FilePoint.LowPart, NULL) || 0U == FileAreaInfo.uActualSize){return FALSE;}if (0U != FilePoint.LowPart && *lpBufSize != FileAreaInfo.uActualSize){*lpBufSize = FileAreaInfo.uActualSize;}memcpy(lpBuffer, FileAreaInfo.uBuffer, *lpBufSize);return TRUE;}/******************************************功能:读入指定的文件内容参数:dwIndex 文件索引参数:dwGroupIndex 组索引参数:dwItemIndex 成员索引参数:lpBuffer 需要读入的缓冲区参数:lpBufSize 读入实际大小返回:TRUE则成功******************************************/BOOLEAN __stdcall ReadFileIndex(DWORD dwIndex, DWORD dwGroupIndex, DWORD dwItemIndex, LPVOID lpBuffer, USHORT * lpBufSize){if (0U == *lpBufSize || TRUE == ::IsBadWritePtr(lpBuffer, *lpBufSize) || dwItemIndex >= MAX_ITEM_COUNT){return FALSE;}if (FALSE == ReadCacheToBuffer(dwIndex, dwGroupIndex, dwItemIndex, lpBuffer, lpBufSize)){return ReadHardDriveFile(G_FileInfo[dwIndex].hSpecFile, dwGroupIndex, dwItemIndex, lpBuffer, lpBufSize);}return TRUE;}/******************************************功能:将索引信息写入文件参数:dwIndex 文件索引返回:TRUE则成功******************************************/static BOOLEAN __fastcall WriteFileHeader(DWORD dwIndex){DWORD dwActualSize;FILE_HEADER_INFO FileHeader;FileHeader.dwGroupCount = G_FileInfo[dwIndex].dwGroupCount;FileHeader.dwGroupIndex = G_FileInfo[dwIndex].dwGroupIndex;FileHeader.dwItemCount = G_FileInfo[dwIndex].dwItemCount;FileHeader.dwItemIndex = G_FileInfo[dwIndex].dwItemIndex;if (INVALID_SET_FILE_POINTER == ::SetFilePointer(G_FileInfo[dwIndex].hSpecFile, 0U, NULL, FILE_BEGIN)){return FALSE;}if (FALSE == ::WriteFile(G_FileInfo[dwIndex].hSpecFile, &FileHeader, sizeof(FILE_HEADER_INFO), &dwActualSize, NULL)){return FALSE;}return TRUE;}/******************************************功能:刷新缓存区并写入文件参数:dwIndex 文件索引返回:TRUE则成功******************************************/BOOLEAN __fastcall FlushFileCache(DWORD dwIndex){if (0U == G_FileInfo[dwIndex].lpCacheInfo.dwCacheToFileCount){SetCacheToFileInfo(dwIndex, G_FileInfo[dwIndex].lpCacheInfo.lpTurnsFileToCache,G_FileInfo[dwIndex].lpCacheInfo.dwFileToCacheCount);return (CacheCopyFile(dwIndex));}return FALSE;}/******************************************功能:关闭指定的文件参数:dwIndex 文件索引返回:TRUE则成功******************************************/BOOLEAN __fastcall CloseFileIndex(DWORD dwIndex){if (NULL != G_FileInfo[dwIndex].hSpecFile){if (FALSE == WriteFileHeader(dwIndex)){return FALSE;}if (FALSE == FlushFileCache(dwIndex)){return FALSE;}::CloseHandle(G_FileInfo[dwIndex].hSpecFile);G_FileInfo[dwIndex].hSpecFile = NULL;}return TRUE;}/******************************************功能:增加指定文件内部索引参数:dwIndex 文件索引返回:不会失败******************************************/static VOID __fastcall AddFileIndexInfo(DWORD dwIndex){G_FileInfo[dwIndex].dwItemIndex++;G_FileInfo[dwIndex].dwItemCount++;if (MAX_ITEM_COUNT == G_FileInfo[dwIndex].dwItemIndex){G_FileInfo[dwIndex].dwGroupIndex++;G_FileInfo[dwIndex].dwGroupCount++;G_FileInfo[dwIndex].dwItemIndex = 0U;}}/******************************************功能:返回可读写的新数据索引参数:dwIndex 文件索引参数:lpGroupIndex 返回新组索引参数:lpItemIndex 返回新成员索引返回:无******************************************/VOID __fastcall GetContentsIndex(DWORD dwIndex, DWORD * lpGroupIndex, DWORD * lpItemIndex){*lpGroupIndex = G_FileInfo[dwIndex].dwGroupIndex;*lpItemIndex = G_FileInfo[dwIndex].dwItemIndex;return (AddFileIndexInfo(dwIndex));}/******************************************功能:从缓存区中查找数据索引参数:dwIndex 文件索引参数:lpBuffer 需要查找的缓冲区参数:uBufSize 查找内容的长度参数:lpGroupIndex 返回组索引参数:lpItemIndex 返回成员索引返回:TRUE则成功******************************************/static BOOLEAN __stdcall FindCacheContentIndex(DWORD dwIndex, LPCVOID lpBuffer, USHORT uBufSize, DWORD * lpGroupIndex, DWORD * lpItemIndex){for (register UINT uFindIndex = 0U; uFindIndex < G_FileInfo[dwIndex].lpCacheInfo.dwFileToCacheCount; ++uFindIndex){if (0 == memcmp(lpBuffer, G_FileInfo[dwIndex].lpCacheInfo.lpTurnsFileToCache[uFindIndex].uBuffer, uBufSize)){*lpGroupIndex = G_FileInfo[dwIndex].lpCacheInfo.lpTurnsFileToCache[uFindIndex].dwGroupIndex;*lpItemIndex = G_FileInfo[dwIndex].lpCacheInfo.lpTurnsFileToCache[uFindIndex].dwItemIndex;return TRUE;}}return FALSE;}/******************************************功能:从硬盘文件中查找数据索引参数:dwIndex 文件索引参数:lpBuffer 需要查找的缓冲区参数:uBufSize 查找内容的长度参数:lpGroupIndex 返回组索引参数:lpItemIndex 返回成员索引返回:TRUE则成功******************************************/static BOOLEAN __stdcall FindFileContentIndex(DWORD dwIndex, LPCVOID lpBuffer, USHORT uBufSize, DWORD * lpGroupIndex, DWORD * lpItemIndex){LARGE_INTEGER FilePoint;PFILE_AREA_INFO FileAreaInfo = (PFILE_AREA_INFO)G_FileInfo[dwIndex].lpFindBuffer;CONST DWORD dwFindCount = ((G_FileInfo[dwIndex].dwItemCount % MAX_ITEM_COUNT) > 0U) ?(G_FileInfo[dwIndex].dwGroupCount + 1U) : (G_FileInfo[dwIndex].dwGroupCount);for (register UINT uFileIndex = 0U; uFileIndex < dwFindCount; ++uFileIndex){FilePoint.QuadPart = sizeof(FILE_HEADER_INFO);FilePoint.QuadPart = FilePoint.QuadPart + ((uFileIndex * MAX_ITEM_COUNT) * sizeof(FILE_AREA_INFO));if (INVALID_SET_FILE_POINTER == ::SetFilePointer(G_FileInfo[dwIndex].hSpecFile, FilePoint.LowPart, &FilePoint.HighPart, FILE_BEGIN)){return FALSE;}if (FALSE == ::ReadFile(G_FileInfo[dwIndex].hSpecFile,FileAreaInfo, (sizeof(FILE_AREA_INFO) * MAX_ITEM_COUNT), &FilePoint.LowPart, NULL)){return FALSE;}FilePoint.LowPart = FilePoint.LowPart / sizeof(FILE_AREA_INFO);for (register UINT uBufferIndex = 0U; uBufferIndex < FilePoint.LowPart; ++uBufferIndex){if (0 == memcmp(lpBuffer, FileAreaInfo[uBufferIndex].uBuffer, uBufSize)){*lpGroupIndex = FileAreaInfo[uBufferIndex].dwGroupIndex;*lpItemIndex = FileAreaInfo[uBufferIndex].dwItemIndex;return TRUE;}}}return FALSE;}/******************************************功能:查找需要读写的数据索引参数:dwIndex 文件索引参数:lpBuffer 需要查找的缓冲区参数:uBufSize 查找内容的长度参数:lpGroupIndex 返回组索引参数:lpItemIndex 返回成员索引返回:TRUE则成功******************************************/BOOLEAN __stdcall FindContentsIndex(DWORD dwIndex, LPCVOID lpBuffer, USHORT uBufSize, DWORD * lpGroupIndex, DWORD * lpItemIndex){if (uBufSize >= MAX_BUFFER_SIZE || TRUE == ::IsBadReadPtr(lpBuffer, uBufSize)){return FALSE;}if (FALSE == FindCacheContentIndex(dwIndex, lpBuffer, uBufSize, lpGroupIndex, lpItemIndex)){return (FindFileContentIndex(dwIndex, lpBuffer, uBufSize, lpGroupIndex, lpItemIndex));}return TRUE;}/******************************************功能:在缓存中检测是否被删除参数:dwIndex 文件索引参数:dwGroupIndex 组索引参数:dwItemIndex 成员索引返回:TRUE则成功******************************************/static BOOLEAN __stdcall IsDeleteCacheContentsIndex(DWORD dwIndex, DWORD dwGroupIndex, DWORD dwItemIndex){if (0U != G_FileInfo[dwIndex].lpCacheInfo.lpTurnsFileToCache[dwItemIndex].uActualSize && dwGroupIndex == G_FileInfo[dwIndex].lpCacheInfo.lpTurnsFileToCache[dwItemIndex].dwGroupIndex){if (TRUE == G_FileInfo[dwIndex].lpCacheInfo.lpTurnsFileToCache[dwItemIndex].uIsDelete){return TRUE;}}return FALSE;}/******************************************功能:在文件中检测是否被删除参数:dwIndex 文件索引参数:dwGroupIndex 组索引参数:dwItemIndex 成员索引返回:TRUE则成功******************************************/static  BOOLEAN __stdcall IsDeleteFileContentsIndex(DWORD dwIndex, DWORD dwGroupIndex, DWORD dwItemIndex){LARGE_INTEGER FilePoint;FILE_AREA_INFO FileAreaInfo;FilePoint.QuadPart = dwGroupIndex * MAX_ITEM_COUNT;FilePoint.QuadPart = FilePoint.QuadPart + dwItemIndex;FilePoint.QuadPart = FilePoint.QuadPart * sizeof(FILE_AREA_INFO);FilePoint.QuadPart = FilePoint.QuadPart + sizeof(FILE_HEADER_INFO);if (INVALID_SET_FILE_POINTER == ::SetFilePointer(G_FileInfo[dwIndex].hSpecFile,FilePoint.LowPart, &FilePoint.HighPart, FILE_BEGIN)){return FALSE;}if (FALSE == ::ReadFile(G_FileInfo[dwIndex].hSpecFile, &FileAreaInfo, sizeof(FileAreaInfo), &FilePoint.LowPart, NULL)){return FALSE;}if (0U != FilePoint.LowPart && TRUE == FileAreaInfo.uIsDelete){return TRUE;}return FALSE;}/******************************************功能:是否是被删除的数据参数:dwIndex 文件索引参数:dwGroupIndex 组索引参数:dwItemIndex 成员索引返回:TRUE则成功******************************************/BOOLEAN __stdcall IsDeleteContentsIndex(DWORD dwIndex, DWORD dwGroupIndex, DWORD dwItemIndex){if (dwItemIndex >= MAX_ITEM_COUNT){return FALSE;}if (FALSE == IsDeleteCacheContentsIndex(dwIndex, dwGroupIndex, dwItemIndex)){return (IsDeleteFileContentsIndex(dwIndex, dwGroupIndex, dwItemIndex));}return TRUE;}/******************************************功能:在缓存中删除数据参数:dwIndex 文件索引参数:dwGroupIndex 组索引参数:dwItemIndex 成员索引返回:TRUE则成功******************************************/static BOOLEAN __stdcall DeleteCacheContentsIndex(DWORD dwIndex, DWORD dwGroupIndex, DWORD dwItemIndex){if (0U != G_FileInfo[dwIndex].lpCacheInfo.lpTurnsFileToCache[dwItemIndex].uActualSize && dwGroupIndex == G_FileInfo[dwIndex].lpCacheInfo.lpTurnsFileToCache[dwItemIndex].dwGroupIndex){if (FALSE == G_FileInfo[dwIndex].lpCacheInfo.lpTurnsFileToCache[dwItemIndex].uIsDelete){G_FileInfo[dwIndex].lpCacheInfo.lpTurnsFileToCache[dwItemIndex].uIsDelete = TRUE;return TRUE;}}return FALSE;}/******************************************功能:在文件中删除数据参数:dwIndex 文件索引参数:dwGroupIndex 组索引参数:dwItemIndex 成员索引返回:TRUE则成功******************************************/static BOOLEAN __stdcall DeleteFileContentsIndex(DWORD dwIndex, DWORD dwGroupIndex, DWORD dwItemIndex){LARGE_INTEGER FilePoint;FILE_AREA_INFO FileAreaInfo;FilePoint.QuadPart = dwGroupIndex * MAX_ITEM_COUNT;FilePoint.QuadPart = FilePoint.QuadPart + dwItemIndex;FilePoint.QuadPart = FilePoint.QuadPart * sizeof(FILE_AREA_INFO);FilePoint.QuadPart = FilePoint.QuadPart + sizeof(FILE_HEADER_INFO);if (INVALID_SET_FILE_POINTER == ::SetFilePointer(G_FileInfo[dwIndex].hSpecFile, FilePoint.LowPart, &FilePoint.HighPart, FILE_BEGIN)){return FALSE;}if (FALSE == ::ReadFile(G_FileInfo[dwIndex].hSpecFile, &FileAreaInfo, sizeof(FileAreaInfo), &FilePoint.LowPart, NULL)){return FALSE;}if (0U != FilePoint.LowPart && FALSE == FileAreaInfo.uIsDelete){FilePoint.QuadPart = dwGroupIndex * MAX_ITEM_COUNT;FilePoint.QuadPart = FilePoint.QuadPart + dwItemIndex;FilePoint.QuadPart = FilePoint.QuadPart * sizeof(FILE_AREA_INFO);FilePoint.QuadPart = FilePoint.QuadPart + sizeof(FILE_HEADER_INFO);if (INVALID_SET_FILE_POINTER == ::SetFilePointer(G_FileInfo[dwIndex].hSpecFile, FilePoint.LowPart, &FilePoint.HighPart, FILE_BEGIN)){return FALSE;}FileAreaInfo.uIsDelete = TRUE;return (::WriteFile(G_FileInfo[dwIndex].hSpecFile, &FileAreaInfo, sizeof(FileAreaInfo), &FilePoint.LowPart, NULL));}return FALSE;}/******************************************功能:删除指定的数据参数:dwIndex 文件索引参数:dwGroupIndex 组索引参数:dwItemIndex 成员索引返回:TRUE则成功******************************************/BOOLEAN __stdcall DeleteContentsIndex(DWORD dwIndex, DWORD dwGroupIndex, DWORD dwItemIndex){if (dwItemIndex >= MAX_ITEM_COUNT){return FALSE;}if (FALSE == DeleteCacheContentsIndex(dwIndex, dwGroupIndex, dwItemIndex)){return (DeleteFileContentsIndex(dwIndex, dwGroupIndex, dwItemIndex));}return TRUE;}/******************************************功能:在缓存中恢复数据参数:dwIndex 文件索引参数:dwGroupIndex 组索引参数:dwItemIndex 成员索引返回:TRUE则成功******************************************/static BOOLEAN __stdcall RecoveryCacheContentsIndex(DWORD dwIndex, DWORD dwGroupIndex, DWORD dwItemIndex){if (0U != G_FileInfo[dwIndex].lpCacheInfo.lpTurnsFileToCache[dwItemIndex].uActualSize && dwGroupIndex == G_FileInfo[dwIndex].lpCacheInfo.lpTurnsFileToCache[dwItemIndex].dwGroupIndex){if (TRUE == G_FileInfo[dwIndex].lpCacheInfo.lpTurnsFileToCache[dwItemIndex].uIsDelete){G_FileInfo[dwIndex].lpCacheInfo.lpTurnsFileToCache[dwItemIndex].uIsDelete = FALSE;return TRUE;}}return FALSE;}/******************************************功能:在文件中恢复数据参数:dwIndex 文件索引参数:dwGroupIndex 组索引参数:dwItemIndex 成员索引返回:TRUE则成功******************************************/static BOOLEAN __stdcall RecoveryFileContentsIndex(DWORD dwIndex, DWORD dwGroupIndex, DWORD dwItemIndex){LARGE_INTEGER FilePoint;FILE_AREA_INFO FileAreaInfo;FilePoint.QuadPart = dwGroupIndex * MAX_ITEM_COUNT;FilePoint.QuadPart = FilePoint.QuadPart + dwItemIndex;FilePoint.QuadPart = FilePoint.QuadPart * sizeof(FILE_AREA_INFO);FilePoint.QuadPart = FilePoint.QuadPart + sizeof(FILE_HEADER_INFO);if (INVALID_SET_FILE_POINTER == ::SetFilePointer(G_FileInfo[dwIndex].hSpecFile,FilePoint.LowPart, &FilePoint.HighPart, FILE_BEGIN)){return FALSE;}if (FALSE == ::ReadFile(G_FileInfo[dwIndex].hSpecFile, &FileAreaInfo, sizeof(FileAreaInfo), &FilePoint.LowPart, NULL)){return FALSE;}if (0U != FilePoint.LowPart && TRUE == FileAreaInfo.uIsDelete){FilePoint.QuadPart = dwGroupIndex * MAX_ITEM_COUNT;FilePoint.QuadPart = FilePoint.QuadPart + dwItemIndex;FilePoint.QuadPart = FilePoint.QuadPart * sizeof(FILE_AREA_INFO);FilePoint.QuadPart = FilePoint.QuadPart + sizeof(FILE_HEADER_INFO);if (INVALID_SET_FILE_POINTER == ::SetFilePointer(G_FileInfo[dwIndex].hSpecFile,FilePoint.LowPart, &FilePoint.HighPart, FILE_BEGIN)){return FALSE;}FileAreaInfo.uIsDelete = FALSE;return (::WriteFile(G_FileInfo[dwIndex].hSpecFile, &FileAreaInfo, sizeof(FileAreaInfo), &FilePoint.LowPart, NULL));}return FALSE;}/******************************************功能:恢复指定的数据参数:dwIndex 文件索引参数:dwGroupIndex 组索引参数:dwItemIndex 成员索引返回:TRUE则成功******************************************/BOOLEAN __stdcall RecoveryContentsIndex(DWORD dwIndex, DWORD dwGroupIndex, DWORD dwItemIndex){if (dwItemIndex >= MAX_ITEM_COUNT){return FALSE;}if (FALSE == RecoveryCacheContentsIndex(dwIndex, dwGroupIndex, dwItemIndex)){return (RecoveryFileContentsIndex(dwIndex, dwGroupIndex, dwItemIndex));}return TRUE;}

TEST.cpp

// StorageFrame.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include "StorageFrameBase.h"#include "amp.h"int _tmain(int argc, _TCHAR* argv[]){DWORD dwGroupIndex;DWORD dwItemIndex;USHORT uSize;char IndexBuf[32];if (FALSE == AllocFileInfo(MAX_FILE_COUNT)){printf("分配文件信息失败!\r\n");return 0;}for (register unsigned int i = 0U; i < MAX_FILE_COUNT; ++i){if (FALSE == AllocBufferInfo(i, MAX_ITEM_COUNT)){printf("分配缓冲区信息失败!\r\n");return 0;}if (FALSE == AllocCacheInfo(i, MAX_CACHE_COUNT)){printf("分配缓存信息失败!\r\n");return 0;}SetFileToCacheL(i);if (FALSE == BindFileToIndex(i, L"D:\\test.txt", wcslen(L"D:\\test.txt"))){printf("绑定文件索引失败!\r\n");return 0;}X = i;for (register unsigned int j = 0U; j < 4096U; ++j){uSize = 32U;_itoa_s(j, IndexBuf, 16);if (FALSE == FindContentsIndex(i, IndexBuf, uSize, &dwGroupIndex, &dwItemIndex)){printf("%d:数据未找到!\r\n",j);GetContentsIndex(i, &dwGroupIndex, &dwItemIndex);}//DeleteContentsIndex(X, PFILE_PARAM(PTRY)->dwGroupIndex, PFILE_PARAM(PTRY)->dwItemIndex);//RecoveryContentsIndex(X, PFILE_PARAM(PTRY)->dwGroupIndex, PFILE_PARAM(PTRY)->dwItemIndex);if (TRUE == IsDeleteContentsIndex(i, dwGroupIndex, dwItemIndex)){//printf("该数据已被删除!\r\n");}else{if (FALSE == WriteFileIndex(i, dwGroupIndex, dwItemIndex, IndexBuf, &uSize)){printf("写入数据失败!\r\n");}else{if (TRUE == ReadFileIndex(i, dwGroupIndex, dwItemIndex, IndexBuf, &uSize)){//printf("读取数据 -> %s\r\n", IndexBuf);}}}}CloseFileIndex(i);FreeBufferInfo(i);FreeCacheInfo(i);}FreeFileInfo();return 0;}



0 0
原创粉丝点击