使用windows c++LockFIle()锁定文件,然后从中获取流
Lock a file using windows c++ LockFIle() then get a stream from it?
我使用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
。
相关文章:
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 如何在C++中获取lua函数作为参数,然后调用它
- 有没有办法将 getline() 与外部文本文件一起使用,然后重新获得 cin 的控制权以从控制台获取输入?
- 当找到来自 RHS 的字符"\"时,从主字符串中获取单词或子字符串,然后擦除其余部分
- 如何从文本文件中获取值,然后用它们执行一些计算(例如乘以并显示它们)?
- 如何以块的形式读取数据,然后从中获取某些数据
- 如何声明一个未知大小的数组,然后输入直到我想要,然后获取数组的大小
- 是否可以注入一个进程并获取给定的句柄,然后使用它们注入另一个进程
- 获取一个输入字符串,将其转换为其十六进制值,然后将其十六进制存储为 int
- 获取字符数组地址,然后转换为指针字符
- 从数组中获取值并计算平均值,然后存储在数组中
- 我如何从FSTREAM中获取数据,然后再次获取数据
- 使用C - CIN获取几个整数数字,然后将它们放入数组中
- 当前尝试使用气泡排序对数组进行排序,然后获取平均值,但返回的平均值是错误的
- 如何使用信号和插槽从qt表单中获取id,然后在链表中搜索它并使用另一个表单显示结果
- 指向数组的指针,然后获取完整的数组c++
- 从字符串中获取一个单词,对其进行更改,然后将其放回正确的位置
- 对指针解引用,然后获取解引用的地址
- 将一个文件映射到内存,然后获取到该内存的文件描述符
- 取消引用无效指针,然后获取结果的地址