使用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 布尔参数

golang Lockfile使用PID文件

读写两个进程的同一个文件是不是需要lockfile

如何在 Linux 中存储 lockfile 命令的 PID

“yarn install --frozen-lockfile”的 NPM 等价物是啥?

yum lockfile is held by another process