Evgenii Legotckoi
Evgenii Legotckoi11. Mai 2020 05:38

Qt WinAPI - Lektion 010. So überprüfen Sie, ob das Schreiben von Dateien durch einen anderen Prozess verboten ist.

Überraschenderweise bin ich im Laufe meiner beruflichen Laufbahn auf ein interessantes Feature von QFile gestoßen. Damit können Sie prüfen, ob es möglich ist, Informationen in eine Datei zu lesen oder zu schreiben. Aber gleichzeitig ignoriert QFile die Lese- und Schreibberechtigungen der Datei, wenn die Datei von mehreren Instanzen desselben Programms geöffnet wird. Das bedeutet, dass QFile, wenn die Datei in einer anderen Instanz des Programms geöffnet wird, diese Datei als lesbar oder schreibbar bestimmt und auch erfolgreich in die Datei schreiben kann.


Beschreibung des Problems

Die Überprüfung auf Schreibverbote kann wie folgt durchgeführt werden, aber dies funktioniert nicht immer, wie ich oben sagte. Aber man kann es so prüfen

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

Sie können die Anweisung ganz am Anfang des Artikels jedoch mit dem folgenden Code testen.

#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();
}

Sobald das Programm erstellt ist, führen Sie mehrere Instanzen zusammen aus und Sie werden sehen, dass der Inhalt der Datei mit der Zeit der letzten Instanzausführung übereinstimmt. Das heißt, QFile ignoriert die Berechtigungen und den Besitz der Datei durch andere Prozesse vollständig. Wenn Sie dieses Programm jedoch ausführen und dann versuchen, den Inhalt der Datei mit einem anderen Programm, z. B. dem Standard-Editor, zu überschreiben, erhalten Sie die folgende Benachrichtigung.

Antworten

Einen Ausweg aus dieser Situation fand ich in der Verwendung plattformspezifischer Funktionalität in WinAPI, möglicherweise Analoga für andere Betriebssysteme.

Dazu müssen Sie einen eindeutigen Zeiger auf den Eingabe- / Ausgabestrom std::wofstream erstellen, dem die Datei gehören wird. Sie können ihn beispielsweise in eine Klasse MyFileBlocker einfügen.
Die Organisation eines Platzes für einen Dateiblocker bleibt in Ihrem Ermessen.

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

Und schreiben Sie dann zwei Funktionen, um die Datei zu sperren und zu entsperren.

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);
    }
}

Und dann können Sie bereits überprüfen, und wenn der Zeiger vorhanden ist, können Sie Aktionen ausführen, um in die Datei zu schreiben.

if (m_openedFile)
{
    // You can write to file
}

Ich gehe auch davon aus, dass dieses Problem gelöst werden kann, indem der laufende Prozess des Programms vereinheitlicht wird, sodass jede Instanz in Bezug auf Dateiberechtigungen als eindeutig identifiziert wird.
Aber um ehrlich zu sein, zum Zeitpunkt der Lösung dieses Problems ist es mir nicht in den Sinn gekommen, also habe ich dieses Problem mit std::wofstream gelöst.

Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.

Magst du es? In sozialen Netzwerken teilen!

Kommentare

Nur autorisierte Benutzer können Kommentare posten.
Bitte Anmelden oder Registrieren
Letzte Kommentare
ИМ
Игорь Максимов5. Oktober 2024 07:51
Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas55. Juli 2024 11:02
QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
k
kmssr8. Februar 2024 18:43
Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
EVA
EVA25. Dezember 2023 10:30
Boost - statisches Verknüpfen im CMake-Projekt unter Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
Jetzt im Forum diskutieren
J
JacobFib17. Oktober 2024 03:27
добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
JW
Jhon Wick1. Oktober 2024 15:52
Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
КГ
Кирилл Гусарев27. September 2024 09:09
Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
F
Fynjy22. Juli 2024 04:15
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

Folgen Sie uns in sozialen Netzwerken