Windows下使用CreateFile()、LockFile()、ReadFile、WriteFile等API完成打开并锁定一个文件进行读取和写入数字或其他内容(已验证)
我们在linux下通过fopen、flock()、fscanf等函数能轻松实现打开并锁定一个文件(独自占有或使用),
进行读写,代码简洁。而我们这篇文章说的是在Windows平台下通过API和C/C++代码实现打开并且锁定一
个文件,以下是实现代码,已经在QtCreator上通过验证(未用Qt类代码),废话不多说,直接上代码:
#include <Windows.h>
#include <cstdlib>
#include <cstdio>
#include <io.h>
#define TEST_FILE_PATH "../TestNumFile.txt"
int main(void)
{
unsigned int InitNum = 0;
char readBuf[100] = {0};
if(!_access(TEST_FILE_PATH, 0))
{
char charPathBuf[256] = TEST_FILE_PATH;
size_t sizeWC;
size_t destLen = mbstowcs(0, charPathBuf, 0);
sizeWC = 2 *destLen + 1;
wchar_t *wcharPathBuf = new wchar_t[sizeWC];
mbstowcs(wcharPathBuf, charPathBuf, sizeWC);
HANDLE aHandle = CreateFile(wcharPathBuf, GENERIC_READ|GENERIC_WRITE,
NULL, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if(aHandle == INVALID_HANDLE_VALUE)
{
DWORD errCode = GetLastError();
printf("When call CreateFile errCode:%lu\n", errCode);
CloseHandle(aHandle);
return -1;
}
DWORD dwHigh = 0;
DWORD dwLow = 0;
dwLow = GetFileSize(aHandle, &dwHigh);
if(dwLow == INVALID_FILE_SIZE)
return -1;
BOOL retLockFile = LockFile(aHandle, NULL, NULL, dwLow, NULL);
if(retLockFile)
{
DWORD ActualBytes = 0;
BOOL retReadFile = ReadFile(aHandle, readBuf, sizeof(readBuf), &ActualBytes, NULL);
if(!retReadFile)
{
UnlockFile(aHandle, NULL, NULL, dwLow, NULL);
CloseHandle(aHandle);
delete wcharPathBuf;
wcharPathBuf = NULL;
return -1;
}
InitNum = (unsigned int)atoi(readBuf);
if(InitNum == 0xFFFFFFF)
{
InitNum = 0x10;
}
InitNum++;
LONG Offsets = 0;
DWORD retSetFileP = SetFilePointer(aHandle, Offsets, NULL, FILE_BEGIN);
if(retSetFileP == INVALID_SET_FILE_POINTER)
{
UnlockFile(aHandle, NULL, NULL, dwLow, NULL);
CloseHandle(aHandle);
delete wcharPathBuf;
wcharPathBuf = NULL;
return -1;
}
BOOL retSetEndOfFile = SetEndOfFile(aHandle);
if(retSetEndOfFile)
{
char writeBuf[256] = {0};
sprintf(writeBuf, "%u", InitNum);
BOOL retWriteFile = WriteFile(aHandle, writeBuf, sizeof(writeBuf), &ActualBytes, NULL);
if(!retWriteFile)
{
UnlockFile(aHandle, NULL, NULL, dwLow, NULL);
CloseHandle(aHandle);
delete wcharPathBuf;
wcharPathBuf = NULL;
return -1;
}
}
UnlockFile(aHandle, NULL, NULL, dwLow, NULL);
}
CloseHandle(aHandle);
delete wcharPathBuf;
wcharPathBuf = NULL;
}
return 0;
}
转载请注明原文地址:https://ipadbbs.8miu.com/read-61622.html