在读/写/追加模式下打开QFile后,我能否检测到它的存在?

Joh*_*itb 5 c++ qt boost qfile

我想写一些文本到一个随机选择的文件名的文件,但想要要求该文件尚不存在.简单QFile::exists检查后跟一个open带有选中名称的竞争条件.

当我打开文件时,确保文件不存在的最佳方法是什么QFile?使用目录boost::filesystem::create_directory,同样的事情可以很好地工作,因为它返回一个布尔值,指示目录是否已存在.但我不知道文件是如何工作的.

Sch*_*eff 5

我必须承认,我从未亲自尝试过.

但是,我记得在文件I/O中防止竞争条件的通常方法是分别尝试处理可能的错误情况.

因此,我查看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;
}
Run Code Online (Sandbox Code Playgroud)

输出:

Qt Version: 5.11.2
Iteration 1
Iteration 2
qFile.open failed! Error code 5
QIODevice::write (QFile, "test.txt"): device not open
Run Code Online (Sandbox Code Playgroud)

我仍然不太确定如何找出它由于已经存在的文件而完全失败(并且不是出于任何其他原因).在我的情况下肯定但总的来说?

(错误代码5很简单QFileDevice::OpenError.)