Я должен признать, что никогда не пробовал это лично.
Однако я вспомнил, что обычный подход к предотвращению состязаний в файловом вводе / выводе состоит в том, чтобы попытаться обработать возможную ошибку соответственно.
Следовательно, я посмотрел на QFile::open()
, что он предлагает и нашел:
QIODevice::NewOnly
:
Ошибка, если открываемый файл уже существует. Создайте и откройте файл, только если он не существует. Существует гарантия от операционной системы, что вы единственный, кто создает и открывает файл. Обратите внимание, что этот режим подразумевает WriteOnly, и его комбинирование с ReadWrite разрешено. Этот флаг в настоящее время влияет только на QFile. Другие классы могут использовать этот флаг в будущем, но до тех пор использование этого флага с любыми классами, кроме QFile, может привести к неопределенному поведению. (начиная с Qt 5.11)
Я только что понял, что (помимо нашей производительной установки Qt 5.9) у меня есть более новая, которую я установил для приватной игры.
Итак, я сделал небольшой пример, чтобы проверить это:
#include <QtWidgets>
int main()
{
qDebug() << "Qt Version:" << QT_VERSION_STR;
for (int i = 1; i <= 2; ++i) {
qDebug() << "Iteration" << i;
QFile qFile("test.txt");
if (!qFile.open(QIODevice::WriteOnly | QIODevice::NewOnly)) {
qDebug() << "qFile.open failed! Error code" << qFile.error();
}
qFile.write("test");
qFile.close();
}
return 0;
}
Выход:
Qt Version: 5.11.2
Iteration 1
Iteration 2
qFile.open failed! Error code 5
QIODevice::write (QFile, "test.txt"): device not open
Я до сих пор не совсем уверен, как узнать, что это не удалось именно из-за уже существующего файла (и не по какой-либо другой причине). В моем случае точно, но в целом?
(код ошибки 5 просто QFileDevice::OpenError
.)