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

suj*_*jin 2 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);
Run Code Online (Sandbox Code Playgroud)

我在 Windows 中尝试使用上面的代码,但它没有锁定整个文件。在我的Windows代码中,我给出了overlapvar.Offset = 0文件的开头并5th argument of LockFileEx to 0锁定直到文件的结尾。

我在Linux中使用fcntl尝试了相同的方法,如下所示。

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)
Run Code Online (Sandbox Code Playgroud)

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

我期望使用LockFileEx或任何其他 API在 Windows 中出现相同的行为。

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

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

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

谢谢。

Jon*_*Jon 5

看来您无条件地希望在打开文件后立即锁定文件的全部内容。如果是这种情况,那么您应该简单地将0(不共享)作为第三个参数传递给而CreateFile不是使用LockFileEx.

LockFileEx特别是关于用法,您将锁定从偏移量 0(通过OVERLAPPED参数)开始且长度为 0(通过前面的两个参数)的区域。您无法使用零指定“直到文件结尾”的区域长度。如果您想锁定跨越整个文件的区域,您只需将两者指定为MAXDWORD.