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
|
namespace file
|
||||||
{
|
{
|
||||||
|
const size_t INITIAL_CAPACITY = 100;
|
||||||
constexpr const char* INVENTORYITEM_FILE = "files/InventoryItem.csv";
|
constexpr const char* INVENTORYITEM_FILE = "files/InventoryItem.csv";
|
||||||
constexpr const char* USER_FILE = "files/User.csv";
|
constexpr const char* USER_FILE = "files/User.csv";
|
||||||
constexpr const char* NOTIFICATION_FILE = "files/Notification.csv";
|
constexpr const char* NOTIFICATION_FILE = "files/Notification.csv";
|
||||||
|
|||||||
Reference in New Issue
Block a user