锁文件不起作用
我已将文件锁定为 0 到 5 个字节,并且我逐字节写入了一些字符,但即使文件被锁定,它也不会停止写入,我不知道出了什么问题,我已经尝试了 createFile 函数中的每种类型的标志,但没有成功,请帮忙。
#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);
}
调用此过程的主要过程如下,我之前没有提到,抱歉。
#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 attr. 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);
}
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 attr. 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);
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
来自 MSDN 文章 LockFile():
嗯,这确实有效。您的测试并未验证另一个进程是否被锁定在文件之外。
From the MSDN article for LockFile():
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.