使用windows c++LockFIle()锁定文件,然后从中获取流

Lock a file using windows c++ LockFIle() then get a stream from it?

本文关键字:然后 获取 文件 c++LockFIle windows 锁定 使用      更新时间:2023-10-16

我使用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;
}

我这样做是因为我发现用流逐行阅读更容易。。。

有解决方案吗?

来自LockFileEx:的文档

如果锁定进程第二次打开文件,则在解锁区域之前,它无法通过第二个句柄访问指定区域。

因此,您需要使用现有的句柄,而不是创建新的句柄。

_open_osfhandle函数允许您从现有句柄创建文件描述符,然后您可以将此文件描述符传递给流构造函数,而不是文件名。

使用FILE_SHARE_READ打开文件。这意味着您允许进一步打开该文件以只读。然后你试着打开它进行写作,这将失败。

请改用FILE_SHARE_READ | FILE_SHARE_WRITE

相关文章: