openorclosefilemappingA
This commit is contained in:
+86
@@ -0,0 +1,86 @@
|
||||
#include "SharedMemory.h"
|
||||
#include "Config.h"
|
||||
|
||||
bool SharedMemory::createOrOpenMapping(MappingInfo& mapping)
|
||||
{
|
||||
if (mapping.recordSize == 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
mapping.fileHandle =
|
||||
CreateFileA(
|
||||
mapping.fileName.c_str(),
|
||||
GENERIC_READ | GENERIC_WRITE,
|
||||
FILE_SHARE_READ | FILE_SHARE_WRITE,
|
||||
NULL,
|
||||
OPEN_ALWAYS,
|
||||
FILE_ATTRIBUTE_NORMAL,
|
||||
NULL);
|
||||
if (mapping.fileHandle == INVALID_HANDLE_VALUE)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
LARGE_INTEGER fileSize;
|
||||
if (!GetFileSizeEx(mapping.fileHandle, &fileSize))
|
||||
{
|
||||
CloseHandle(mapping.fileHandle);
|
||||
mapping.fileHandle = INVALID_HANDLE_VALUE;
|
||||
return false;
|
||||
}
|
||||
bool isNewFile = (fileSize.QuadPart == 0);
|
||||
const size_t initialCapacity = config::file::INITIAL_CAPACITY;
|
||||
if (isNewFile)
|
||||
{
|
||||
LARGE_INTEGER newSize;
|
||||
newSize.QuadPart = sizeof(FileHeader) + initialCapacity * mapping.recordSize;
|
||||
if (!SetFilePointerEx(mapping.fileHandle, newSize, NULL, FILE_BEGIN))
|
||||
{
|
||||
CloseHandle(mapping.fileHandle);
|
||||
mapping.fileHandle = INVALID_HANDLE_VALUE;
|
||||
return false;
|
||||
}
|
||||
if (!SetEndOfFile(mapping.fileHandle))
|
||||
{
|
||||
CloseHandle(mapping.fileHandle);
|
||||
mapping.fileHandle = INVALID_HANDLE_VALUE;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
mapping.mappingHandle =
|
||||
CreateFileMappingA(
|
||||
mapping.fileHandle,
|
||||
NULL,
|
||||
PAGE_READWRITE,
|
||||
0,
|
||||
0,
|
||||
NULL);
|
||||
if (mapping.mappingHandle == NULL)
|
||||
{
|
||||
CloseHandle(mapping.fileHandle);
|
||||
mapping.fileHandle = INVALID_HANDLE_VALUE;
|
||||
return false;
|
||||
}
|
||||
mapping.mappedView =
|
||||
MapViewOfFile(
|
||||
mapping.mappingHandle,
|
||||
FILE_MAP_ALL_ACCESS,
|
||||
0,
|
||||
0,
|
||||
0);
|
||||
if (mapping.mappedView == nullptr)
|
||||
{
|
||||
CloseHandle(mapping.mappingHandle);
|
||||
CloseHandle(mapping.fileHandle);
|
||||
mapping.mappingHandle = NULL;
|
||||
mapping.fileHandle = INVALID_HANDLE_VALUE;
|
||||
return false;
|
||||
}
|
||||
FileHeader* header = reinterpret_cast<FileHeader*>(mapping.mappedView);
|
||||
if (isNewFile)
|
||||
{
|
||||
header->recordCount = 0;
|
||||
header->capacity = initialCapacity;
|
||||
}
|
||||
mapping.mappedCapacity = header->capacity;
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -28,6 +28,7 @@ namespace config
|
||||
|
||||
namespace file
|
||||
{
|
||||
const size_t INITIAL_CAPACITY = 100;
|
||||
constexpr const char* INVENTORYITEM_FILE = "files/InventoryItem.csv";
|
||||
constexpr const char* USER_FILE = "files/User.csv";
|
||||
constexpr const char* NOTIFICATION_FILE = "files/Notification.csv";
|
||||
|
||||
Reference in New Issue
Block a user