使用windows c++ LockFIle() 锁定文件然后从中获取流?
Posted
技术标签:
【中文标题】使用windows c++ LockFIle() 锁定文件然后从中获取流?【英文标题】:Lock a file using windows c++ LockFIle() then get a stream from it? 【发布时间】:2014-07-09 21:24:38 【问题描述】:我已经使用LockFileEx
锁定了一个文件,但我无法从中打开一个流。
HANDLE indexHandle = CreateFile (indexFileName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, 0,
OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
bool indexLock = false;
OVERLAPPED overlapped;
memset (&overlapped, 0, sizeof (overlapped));
while (noOfTries >0 && !indexLock)
if (!LockFileEx (indexHandle, LOCKFILE_EXCLUSIVE_LOCK, 0, 0, UINT_MAX, &overlapped))
InfoLog << "Failed to get lock on index file -- Error code is ["
<< GetLastError () <<"]"<<std::endl;
Sleep(sleepTime);
noOfTries--;
else
indexLock=true;
获取锁后,我想这样做:
string indexFile = mPath + Util::PATH_SEPARATOR + mIndexFileName;
os.open( indexFile.c_str(), ios_base::app);
if (!os)
InfoLog << "BinaryFileSystemObjectStore:: ofstream: Failed to open index for write: " << indexFile.c_str() << endl;
我这样做是因为我发现逐行阅读流更容易...
有解决办法吗?
【问题讨论】:
【参考方案1】:来自documentation for LockFileEx:
如果锁定进程再次打开文件,它无法通过第二个句柄访问指定区域,直到它解锁该区域。
因此,您需要使用已有的句柄,而不是创建新的句柄。
_open_osfhandle 函数允许您从现有句柄创建文件描述符,然后您可以将此文件描述符传递给 ofstream constructor 而不是文件名。
【讨论】:
ofstream 构造函数不接受文件描述符作为构造函数参数......你能帮我吗? 自 VS6 以来这似乎已经改变,不再受支持。这是不幸的;我不知道为什么我们失去了这些基本功能。也许answers to this question 可能会有所帮助。【参考方案2】:您使用FILE_SHARE_READ
打开文件。这意味着您允许进一步以只读方式打开文件。然后你尝试打开它写,会失败。
请改用FILE_SHARE_READ | FILE_SHARE_WRITE
。
【讨论】:
以上是关于使用windows c++ LockFIle() 锁定文件然后从中获取流?的主要内容,如果未能解决你的问题,请参考以下文章
Simplecov gem 使用过时的 lockfile 布尔参数
如何在 Linux 中存储 lockfile 命令的 PID