在Windows中使用LockFileEx API锁定整个文件

时间:2014-08-19 12:00:59

标签: c++ c linux windows visual-c++

可以使用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, &param)

基于两个变量param.l_startparam.l_len,我们用来决定锁定哪个偏移量。通过将这两个变量设置为 0 ,帮助我们从 Linux 中的文件开始到结束锁定。

我期望使用LockFileEx或任何其他API在Windows中执行相同的操作。

是否可以使用LockFileEx在Windows中执行完整文件锁定?

是否有其他API可用于执行完整文件锁定?

还有其他方法可以在Windows中执行相同的操作吗?

感谢。

2 个答案:

答案 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);