locking一个文件使用Windows c + + LockFIle()然后从它得到一个stream?

我已经使用LockFileExlocking了一个文件,但是我无法从中打开一个stream。

 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; } 

我这样做是因为我发现它更容易阅读与stream逐行…

有解决scheme吗?

Solutions Collecting From Web of "locking一个文件使用Windows c + + LockFIle()然后从它得到一个stream?"

从LockFileEx的文档 :

如果锁定过程第二次打开文件,则无法通过此第二个句柄访问指定的区域,直到解锁该区域。

所以你需要使用你已经拥有的手柄,而不是创建一个新手柄。

_open_osfhandle函数允许你从现有句柄创建一个文件描述符,然后你可以把这个文件描述符传递给ofstream构造函数而不是文件名。

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

使用FILE_SHARE_READ | FILE_SHARE_WRITE FILE_SHARE_READ | FILE_SHARE_WRITE