Qt WinAPI - Lesson 010. How to check if file writing is prohibited by another process.

WinAPI, Qt, QFile


Surprisingly, in the course of my professional activity, I stumbled upon one interesting feature of QFile. With it, you can check whether it is possible to read or write information to a file. But at the same time, QFile ignores read and write permissions of the file if the file is opened by several instances of the same program. This means that if the file is opened in another instance of the program, then QFile will determine this file as readable or writable, and will also be able to write to the file successfully.

Description of the problem

The write ban check can be performed as follows, but this does not always work, as I said above. But you can check it like this

bool isFileWritable(const QString& fileName)
     QFile file(fileName);
     bool isWritable = file.open(QFile::ReadWrite);
     return isWritable;

However, you can verify the statement said at the very beginning of the article using the following code.

#include <QCoreApplication>

#include <QFile>
#include <QDebug>
#include <QDateTime>

int main(int argc, char *argv[])
    QCoreApplication a(argc, argv);

    // Подставьте любой удобный для вас путь к файлу
    QFile file("D:/check.txt");

    return a.exec();

After building the program, run several instances together and you will see that the contents of the file will correspond to the time of the last launched instance. That is, QFile completely ignores the access rights and ownership of the file by other processes. However, if you run this program, and then try to overwrite the contents of the file with another program, for example standard Notepad, you will receive the following notification.


I found a solution to this situation in the use of platform-dependent functionality in WinAPI, analogues for other OS are probably possible.

To do this, you need to create a unique pointer to the input/output stream std::wofstream , which will own the file, you can place it in some class MyFileBlocker , for example.
The question of organizing a place for a file blocker will be left to your discretion.

std::unique_ptr<std::wofstream> m_openedFile;

And then write two functions to lock and unlock the file.

void MyFileBlocker::unlockFile()

void MyFileBlocker::relockFile(std::wstring fileName)
    m_openedFile.reset(new std::wofstream());
    // _SH_DENYWR is WinAPI dependent deny write mode
    m_openedFile->open(fileName, std::ios_base::app, _SH_DENYWR);
    if (!m_openedFile->is_open())

And then you can already check, and if the pointer exists, then you can perform the actions of writing to the file.

if (m_openedFile)
    // You can write to file

Also, I suppose that this problem can be solved by unifying the running process of the program so that each instance is identified as unique with respect to file permissions.
But I will be honest, at the time of solving this problem it did not occur to me, so I solved this problem using std::wofstream .

We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.
- company blog
Support the author Donate


Only authorized users can post comments.
Please, Log in or Sign up
How to become an author?

Contribute to the evolution of the EVILEG community.

Learn how to become a site author.

Learn it

Good day, Dear Users!!!

I am Evgenii Legotckoi, developer of EVILEG. And it is my hobby project, which helps to learn programming another programmers and developers

If the site helped you, and you want also support the development of the site, than you can donate by following ways


Let me recommend you the excellent hosting on which EVILEG is located.

For many years, Timeweb has been proving his stability.

For projects on Django I recommend VDS hosting

View Hosting Timeweb
June 5, 2020, 11:20 p.m.

C ++ - Test 004. Pointers, Arrays and Loops

  • Result:60points,
  • Rating points-1
June 5, 2020, 11:15 p.m.

C++ - Test 001. The first program and data types

  • Result:53points,
  • Rating points-4
June 5, 2020, 4:47 p.m.

C++ - Test 005. Structures and Classes

  • Result:83points,
  • Rating points4
Last comments
June 5, 2020, 10:52 a.m.

Распознавание изображений на Python с помощью TensorFlow и Keras

Огромное спасибо за метериал, по-больше бы подобных статей (с подробным описанием работы и примерами применения) на тему современных технологий. Вопрос поразмышлять. На текущий момент реал…
June 5, 2020, 1:39 a.m.
Evgenij Legotskoj

Qt/C++ - Tutorial 091. How to write a custom delegate controlling the highlighting of a row in a table

По-моему, смысла в этом нет особого. Если делегат будет игнорировать настройки таблицы, то это приведёт ещё к большему непониманию, что вообще происходит, для программиста, который после вас буд…
June 5, 2020, 1:34 a.m.

Qt/C++ - Tutorial 091. How to write a custom delegate controlling the highlighting of a row in a table

Сижу, размышляю: можно ли переписать делегата так, чтобы независимо от настроек строк выделялись строки?
June 5, 2020, 1:31 a.m.
Evgenij Legotskoj

Qt/C++ - Tutorial 091. How to write a custom delegate controlling the highlighting of a row in a table

Понятно. Я не обратил внимания на то, что там было в старом коде по настройкам строк :)
Now discuss on the forum
June 6, 2020, 1:54 a.m.

Qt/C++ Определение положения курсора над действие(кнопкой) в QToolBar

Доброго дня. Возник вопрос - как можно определить что курсор находится над определенным действием(кнопкой) в qtoolbar ? mainwindow.cpp MainWindow::MainWi…
June 6, 2020, 12:45 a.m.

Qt/C++ особенности QProxyStyle

Да, Вы правы. Код был скопирован с сайта (уже не помню с какого), но решил пойти по пути более легком. Пришлось переписать - кому интересно: использовал stackedWidget для пе…
June 5, 2020, 11:08 p.m.

Посоветуйте новичку (базы данных и Qt, что учить)

Блин, а я недавно купил Шлее Qt 5.10 :( С детства хотел стать программистом, баловался Паскалем, писал простенькие программки на Delphi, создавал движок на php, изучал C (забросил и перешел на п…
June 5, 2020, 1:09 p.m.

QPlainTextEdit настройка цвета фона

Вечер добрый. Пытаюсь настроить цвет фона QPlainTextEdit следующим образом: CodeEditor::CodeEditor(QWidget *parent) : QPlainTextEdit(parent){ ... QPalette::ColorRole role = bac…
June 5, 2020, 6:13 a.m.

Фильтр для QtableView sql

Добрый день. Для такой фильтрации необходимо использовать QSortFilterProxyModel. В оффдоках есть хороший пример.
© EVILEG 2015-2020
Recommend hosting TIMEWEB