Могу ли я обнаружить предварительное существование файла QFile после его открытия в режиме чтения / записи / добавления? - PullRequest
0 голосов
/ 16 января 2019

Я хочу записать некоторый текст в файл со случайно выбранным именем файла, но хочу, чтобы этот файл еще не существовал. Существует расовое условие между простой проверкой QFile::exists, за которой следует open с проверенным именем.

Как лучше всего убедиться, что файл не существовал ранее, когда я открываю его с помощью QFile? То же самое с каталогом прекрасно работает при использовании boost::filesystem::create_directory, потому что возвращает логическое значение, которое указывает, существовал ли каталог ранее или нет. Но я не вижу, как это работает с файлами.

1 Ответ

0 голосов
/ 16 января 2019

Я должен признать, что никогда не пробовал это лично.

Однако я вспомнил, что обычный подход к предотвращению состязаний в файловом вводе / выводе состоит в том, чтобы попытаться обработать возможную ошибку соответственно.

Следовательно, я посмотрел на 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.)

...