Windows下使用CreateFile()、LockFile()等API完成打开并锁定一个文件进行读取和写入数字或其他内容

    技术2025-12-23  16

    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)) { //add lock 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;//save the bit:33~64, when the file size greater than 4GB DWORD dwLow = 0;//save the bit:1~32 dwLow = GetFileSize(aHandle, &dwHigh); if(dwLow == INVALID_FILE_SIZE) return -1; //lock the file 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; }
    Processed: 0.010, SQL: 9