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

Запрос, который вы хотите, следующий:

db.collection.find({"users":{"$not":{"$elemMatch":{"user":{$nin:[1,5,7]}}}}})

Это говорит, что найти все документы, которые не имеют элементов, которые находятся за пределами списка 1,5,7.

5
задан Johannes Schaub - litb 16 January 2019 в 16:56
поделиться

1 ответ

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

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

Следовательно, я посмотрел в QFile::open() , что он предлагает и нашел:

QIODevice::NewOnly : [1111 ]

Ошибка, если открываемый файл уже существует. Создайте и откройте файл, только если он не существует. Существует гарантия от операционной системы, что вы единственный, кто создает и открывает файл. Обратите внимание, что этот режим подразумевает 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 .)

0
ответ дан Scheff 16 January 2019 в 16:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: