可以使用C ++在Windows中使用LockFileEx API锁定特定偏移量,我试过这个并获得了成功的结果。
但我尝试使用LockFileEx锁定整个文件,但我没做到。我没有在网站上找到任何文件如何使用LockfileEX进行完整文件锁定。
ifile = CreateFile(argv[1], GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_ALWAYS, 0, NULL);
if (ifile == INVALID_HANDLE_VALUE) {
printf("CreateFile failed (%d)\n", GetLastError());
return 1;
}
OVERLAPPED overlapvar;
overlapvar.Offset = 0;
overlapvar.OffsetHigh = 0;
success = LockFileEx(ifile, LOCKFILE_EXCLUSIVE_LOCK | LOCKFILE_FAIL_IMMEDIATELY, 0, 0, 0, &overlapvar);
我尝试在Windows中使用上面的代码,但它没有锁定整个文件。在我的Windows代码中,我给overlapvar.Offset = 0
说明了文件的开头,5th argument of LockFileEx to 0
要锁定到文件的末尾。
我使用 fcntl 在 linux 中尝试了相同的方法,如下所示。
struct flock param ;
param.l_type = F_RDLCK ;
param.l_whence = 0 ;
param.l_start = 0 ; //start of the file
param.l_len = 0 ; // 0 means end of the file
fcntl(FileFd, F_SETLKW, ¶m)
基于两个变量param.l_start
和param.l_len
,我们用来决定锁定哪个偏移量。通过将这两个变量设置为 0 ,帮助我们从 Linux 中的文件开始到结束锁定。
我期望使用LockFileEx或任何其他API在Windows中执行相同的操作。
是否可以使用LockFileEx在Windows中执行完整文件锁定?
是否有其他API可用于执行完整文件锁定?
还有其他方法可以在Windows中执行相同的操作吗?
感谢。
答案 0 :(得分:3)
您似乎无条件地希望在打开文件后立即锁定文件的全部内容。如果是这种情况,那么您只需将0
(不共享)作为第三个参数传递给CreateFile
,而不是使用LockFileEx
。
特别是关于LockFileEx
用法,您将锁定从偏移0开始的区域(通过OVERLAPPED
参数)和长度为0的区域(通过前两个参数)。您不能使用零指定区域长度的“直到文件结尾”。如果要锁定跨越整个文件的区域,则只需指定为MAXDWORD
。
答案 1 :(得分:1)
文档明确告诉您OVERLAPPED结构的hEvent
成员必须有效。而OVERLAPPED医生说
在结构用于函数调用之前,应始终将此结构的任何未使用的成员初始化为零。否则,该函数可能会失败并返回
ERROR_INVALID_PARAMETER
。
为什么要将未初始化的结构传递给API函数?尝试正确初始化overlapvar
:
OVERLAPPED overlapvar = { 0 };
success = LockFileEx(ifile, LOCKFILE_EXCLUSIVE_LOCK | LOCKFILE_FAIL_IMMEDIATELY,
0, MAXDWORD, MAXDWORD, &overlapvar);