i have locked my file from 0 to 5 bytes, and i write some character byte by byte but it does not stop writing even if the file is locked, i dont know what is wrong, i have tried every type of flag in createFile function, but no success, please help.
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
#include <strsafe.h>
#include <stdlib.h>
void __cdecl _tmain(int argc, TCHAR *argv[])
{
DWORD dwBytesWritten;
HANDLE hFile;
BOOL filesize= FALSE;
LARGE_INTEGER pl_int;
PLARGE_INTEGER pli_int = &pl_int;
char * Buffer = (char *)malloc (1);
Buffer[0]='0';
printf("Detect Lock Process Started\n");
hFile = CreateFile(argv[1], // open One.txt
GENERIC_WRITE|GENERIC_READ, // open for reading
FILE_SHARE_READ | FILE_SHARE_WRITE, // do not share
NULL, // no security
OPEN_EXISTING, // existing file only
FILE_ATTRIBUTE_NORMAL, // normal file
NULL); // no attr. template
if (hFile == INVALID_HANDLE_VALUE)
{
printf("Could not open %s\n",argv[1]);
return;
}
filesize = GetFileSizeEx(hFile, pli_int);
__int64 fsizes= (__int64)(pli_int->QuadPart);
if (filesize == FALSE)
printf("Could not get file size\n");
else
_tprintf(TEXT("%s (%d bytes) \n"), argv[1], fsizes);
bool lock = LockFile(hFile,5,0,10,0);
if (lock == FALSE)
printf("lockfailed\n");
for(int x=0; x < fsizes; x++)
{
if (!WriteFile(hFile,Buffer,1,&dwBytesWritten,NULL))
//if (!ReadFile(hFile,Buffer,1,&dwBytesWritten,NULL))
{
printf("File Locked-could not Write file at byte %d\n",x);
}
else
printf("File Written at byte %d\n",x);
}
free(Buffer);
CloseHandle(hFile);
}
THE MAIN PROCESS THAT CALLS THIS PROCESS IS BELOW, i didnt mention it earlier, sorry abt that.
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
#include <strsafe.h>
#include <stdlib.h>
void DisplayError(LPTSTR lpszFunction);
void __cdecl _tmain(int argc, TCHAR *argv[])
{
HANDLE hFile;
if(argc < 4 || argc%2 != 0) //check if low count or odd count
{
printf("Wrong set of parameters \n");
printf("Parameters=> <lockfile> <File Name> (<Lock region Start value> <Lock reigion Stop value>......)\n");
return;
}
if (argc > 12)
{
printf("Too many arguments\n");
return;
}
// Open the existing file.
hFile = CreateFile(argv[1], // open One.txt
GENERIC_READ, // open for reading
FILE_SHARE_READ | FILE_SHARE_WRITE, // do not share
NULL, // no security
OPEN_EXISTING, // existing file only
FILE_ATTRIBUTE_NORMAL, // normal file
NULL); // no att开发者_高级运维r. template
if (hFile == INVALID_HANDLE_VALUE)
{
printf("Could not open %s\n",argv[1]);
return;
}
int i=argc-2;
int count[10];
for (int j=0; j<i; j++)
{
count[j]=_ttoi(argv[2+j]);
}
for(int z=0; z<i; z=z+2)
{
if(!LockFile(hFile,count[z],0,count[z+1]-count[z],0))
DisplayError(TEXT("LockFile"));
else
printf("file locked from %d to %d bytes\n",count[z],count[z+1]);
}
STARTUPINFO si;
PROCESS_INFORMATION pi;
printf("Calling Detect Lock\n");
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );
LPTSTR szCmdline = _tcsdup(TEXT("C:\\detectlock\\Debug\\detectlock.exe ass23.txt"));
if( !CreateProcess( NULL, // No module name (use command line)
szCmdline, // Command line
NULL, // Process handle not inheritable
NULL, // Thread handle not inheritable
FALSE, // Set handle inheritance to FALSE
0, // No creation flags
NULL, // Use parent's environment block
NULL, // Use parent's starting directory
&si, // Pointer to STARTUPINFO structure
&pi ) // Pointer to PROCESS_INFORMATION structure
)
{
printf( "CreateProcess failed (%d)\n", GetLastError() );
return;
}
// Wait until child process exits.
WaitForSingleObject( pi.hProcess, INFINITE );
// Close process and thread handles.
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
CloseHandle(hFile);
//CloseHandle(hAppend);
}
From the MSDN article for LockFile():
Locks the specified file for exclusive access by the calling process.
Well, that surely worked. Your test is not verifying if another process is locked out of the file.
Locking the file does not prevent the lock holder from writing: the purpose of the lock is to prevent other processes accessing the locked portion.
精彩评论