独占打开文件/锁定文件

Posted

技术标签:

【中文标题】独占打开文件/锁定文件【英文标题】:Open file exclusively/lock file 【发布时间】:2012-08-10 07:38:43 【问题描述】:

我想锁定现有文件以防止其他进程使用(读取和写入)。也就是说,此进程或任何其他进程随后打开文件的任何尝试都应失败并出现“拒绝访问”错误。

CreateFile WINAPI 函数有一个 dwShareMode 参数,它正是这样做的,我正在寻找类似的功能,同时仍然能够使用 QFile

【问题讨论】:

【参考方案1】:

我发现的一种方法是在打开文件后在底层操作系统句柄上使用LockFile。

请注意,LockFile 的行为略有不同 - 后续尝试打开成功,但实际读取或写入将失败,ERROR_LOCK_VIOLATION

#include <windows.h>
#include <io.h>
bool lockFile(QFile *file) 
    return (bool) LockFile((HANDLE) _get_osfhandle(file->handle()), 0, 0, -1, -1);

void test() 
    QFile f("test.txt");
    f.open(QIODevice::ReadOnly);
    lockFile(&f);

【讨论】:

【参考方案2】:

您是否尝试过使用 Notepad++ 保存(覆盖)?我相信正确的行为是它不会让你写入相同的文件名。打开(阅读)是不可强制执行的;写作才是真正的考验。

【讨论】:

在windows上可以给一个文件一个排他锁并阻止读写。问题是如何用 qt 做到这一点?我确实需要锁定文件不被读取。

以上是关于独占打开文件/锁定文件的主要内容,如果未能解决你的问题,请参考以下文章

Vmware14 开机黑屏或者以独占方式锁定此配置文件失败等问题解决办法

Vmware提示以独占方式锁定此配置文件失败。另一个正在运行的VMware进程可能正在使用配置文件

您不具有对数据库的独占访问权限这一次。如果继续进行更改,您可能无法将其保存

当锁定文件的另一个 FileChannnel 关闭时,文件的独占锁定被降级

独占锁定文件,然后删除/移动它

C++:以非独占模式打开文件