Evgenij LegotskojMay 11, 2020, 4:38 a.m.

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

Content

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);
     file.close();
     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");
    file.write(QDateTime::currentDateTime().toString().toLatin1());
    file.flush();

    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.

Decision

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()
{
    m_openedFile.reset(nullptr);
}

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())
    {
        m_openedFile.reset(nullptr);
    }
}

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

Comments

Only authorized users can post comments.
Please, Log in or Sign up
Timeweb

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
V
  • Viktor
  • April 14, 2021, 3:40 p.m.

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

  • Result:50points,
  • Rating points-4
F
  • Fedya
  • April 14, 2021, 4:04 a.m.

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

  • Result:66points,
  • Rating points-1
KP

C++ - Тест 003. Условия и циклы

  • Result:71points,
  • Rating points1
Last comments
YA

PyQt5 - Tutorial 009. Using QThread with MoveToThread

Hello. Let's say I want to send some variables to "run" define. How can we do that? I modified your code, I tried something like below, but the GUI is frozen that way. I could not be able to und…
R

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

почему то вместо 50000 обрабатывает по 782 картинки кажду. эпоху
R
AB

Qt/C++ - Lesson 008. QDataWidgetMapper - Working with the database via a widget

Понял сам так - происходит через setTable() "Sets the database table on which the model operates to tableName. Does not select data from the table, but fetches its field information", а затем че…
AB

Qt/C++ - Lesson 008. QDataWidgetMapper - Working with the database via a widget

Начал делать что-то похожее, но без sql. Не очень понимаю, что делает mapper->setCurrentModelIndex(model->index(row,0)); Вернее не понимаю вот что: откуда он берёт данные, кот…
Now discuss on the forum
VB

Помогите переложить код QML OpenCV c PyQt5 на PySide2

Структура проекта ├── main.py ├── main.qml └── PyCVQML ................├── cvcapture.py ................├── cvitem.py ................└── init .py …

QScrollArea dynamically add QCheckBoxes

Всё правильно. Это просто спамер, который отправился в вечный бан.
d

Подключение приложения qt qml к БД postgresql из приложения qt qml c++, собранное под android

Алексей, код уже написан. Приложение работает под ОС Windows, но хочется его запустить на Android. По поводу сборки драйвера, не получается найти свежей инструкции, а главное рабочей.
d

Qt, Sqlite и Android. Как подключить базу данных?

Добрый день, добавил базу к ресурсам, приложение вроде как открывает БД, но данные не видет, что может быть не так? qt qml c++ под android m_db = QSqlDatabase::addDatabase("QSQLITE")…
  • BlinCT
  • April 13, 2021, 4:11 a.m.

Отображение талицы в Column в qml обьекте

Проблема в том что я все таблицы перевел на вторые контролы, все таблицы на них сделаны, шаблон для них всех создан. Только под 2 эти таблицы возвпащать все на первые контролы не думаю что прави…
About
Services
© EVILEG 2015-2021
Recommend hosting TIMEWEB