QFile的open(QIODeivce::WriteOnly)写文件时是独占模式还是非独占
在 Qt 中,QFile 的 open(QIODevice::WriteOnly) 默认是以 独占模式(Exclusive Mode) 打开文件的,这意味着:
1. 独占模式(Exclusive Mode)的特点
-
文件被锁住:其他进程或线程无法同时以写入(
WriteOnly或ReadWrite)方式打开该文件。 -
读取不受影响:其他进程仍然可以以只读(
ReadOnly)方式打开文件(除非额外指定QIODevice::Exclusive)。 -
行为类似
O_EXCL:如果文件已存在且被其他进程以写入方式打开,本次open()会失败。
2. 验证独占模式
示例代码
#include <QFile>
#include <QDebug>
int main() {
QFile file("test.txt");
// 以 WriteOnly 模式打开(默认独占)
if (file.open(QIODevice::WriteOnly)) {
qDebug() << "文件打开成功";
file.write("Hello, Qt!");
file.close();
} else {
qDebug() << "文件打开失败:" << file.errorString();
}
return 0;
}
测试场景
-
进程 A 以
WriteOnly打开文件时:-
进程 B 尝试以
WriteOnly打开同一文件 → 失败(返回false,错误信息为"The process cannot access the file because it is being used by another process")。 -
进程 B 以
ReadOnly打开 → 成功。
-
3. 如何改为非独占模式?
如果需要允许多个进程同时写入同一个文件,可以组合使用 QIODevice::WriteOnly 和 QIODevice::Append:
file.open(QIODevice::WriteOnly | QIODevice::Append);
-
Append模式:所有写入操作会自动跳到文件末尾,避免数据覆盖。 -
仍然非原子操作:多个进程同时写入时可能会交错数据(需自行处理同步)。
4. 跨平台行为
| 平台 | 独占行为 |
|---|---|
| Windows | 严格独占(其他进程无法以写入方式打开)。 |
| Linux/macOS | 默认独占,但某些文件系统(如 NFS)可能表现不同。 |
5. 强制非独占模式(平台相关)
如果需要完全禁用文件锁(非标准操作),需调用平台特定的 API:
Windows(取消共享锁)
#include <windows.h>
QFile file("test.txt");
// 使用 _fsopen 或 CreateFile 设置共享模式(需自行封装)
Linux/macOS(flock 或 fcntl)
int fd = open("test.txt", O_WRONLY | O_CREAT, 0666);
flock(fd, LOCK_UN); // 解除锁
6. 总结
| 模式 | 行为 | 适用场景 | |
|---|---|---|---|
WriteOnly |
默认独占(其他进程不可写) | 安全写入,避免冲突 | |
| `WriteOnly | Append` | 非独占(追加写入) | 多进程日志记录 |
| 平台特定 API | 完全禁用锁 | 需要极端控制时(不推荐) |
如果需要在多进程间共享写入,建议使用:
-
QSaveFile(原子写入,适合配置文件)。 -
进程间通信(IPC)(如
QLocalSocket)。 -
数据库/SQLite(处理并发更安全)。
浙公网安备 33010602011771号