Evgenii Legotckoi
May 11, 2020, 3:38 p.m.

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

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

  1. bool isFileWritable(const QString& fileName)
  2. {
  3.      QFile file(fileName);
  4.      bool isWritable = file.open(QFile::ReadWrite);
  5.      file.close();
  6.      return isWritable;
  7. }

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

  1. #include <QCoreApplication>
  2.  
  3. #include <QFile>
  4. #include <QDebug>
  5. #include <QDateTime>
  6.  
  7. int main(int argc, char *argv[])
  8. {
  9. QCoreApplication a(argc, argv);
  10.  
  11. // Подставьте любой удобный для вас путь к файлу
  12. QFile file("D:/check.txt");
  13. file.write(QDateTime::currentDateTime().toString().toLatin1());
  14. file.flush();
  15.  
  16. return a.exec();
  17. }
  18.  

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.

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

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

  1. void MyFileBlocker::unlockFile()
  2. {
  3. m_openedFile.reset(nullptr);
  4. }
  5.  
  6. void MyFileBlocker::relockFile(std::wstring fileName)
  7. {
  8. m_openedFile.reset(new std::wofstream());
  9. // _SH_DENYWR is WinAPI dependent deny write mode
  10. m_openedFile->open(fileName, std::ios_base::app, _SH_DENYWR);
  11. if (!m_openedFile->is_open())
  12. {
  13. m_openedFile.reset(nullptr);
  14. }
  15. }

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

  1. if (m_openedFile)
  2. {
  3. // You can write to file
  4. }

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 .

Recommended articles on this topic

By article asked0question(s)

1

Comments

Only authorized users can post comments.
Please, Log in or Sign up
  • Last comments
  • Evgenii Legotckoi
    March 9, 2025, 9:02 p.m.
    К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
  • VP
    March 9, 2025, 4:14 p.m.
    Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
  • ИМ
    Nov. 22, 2024, 9:51 p.m.
    Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
  • Evgenii Legotckoi
    Oct. 31, 2024, 11:37 p.m.
    Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
  • A
    Oct. 19, 2024, 5:19 p.m.
    Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html