Qt - QFile czy warunki sprawdzenia istnienia pliku mają sens

0

Mam jedno pytanko. Chodzi o warunki zawarte w if - else czy one mają sens ?

Jakkolwiek by nie było bufor w warunku else muszę otworzyć ale czy zawartość if ma sens ?

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

    QFile loadJsonFile;

    loadJsonFile.setFileName(QString("settings.json"));

    if(!loadJsonFile.exists() == true){
        qDebug()<< "Nie mozna wczytac pliku z ustawieniami";
    }
    else if(loadJsonFile.open(QIODevice::ReadOnly | QIODevice::Text)){
        qDebug()<< "Plik wczytano";

        QByteArray loadData;
        loadData = loadJsonFile.readAll();

        QJsonDocument data;
        QJsonObject obj;
        data = QJsonDocument::fromJson(loadData);

        obj = data.object();
        qDebug()<< obj;
    }

    return a.exec();
}

Podzieliłby się ktoś swoimi doświadczeniami w pracy nad plikami ?

5

Nie ma sensu, a na produkcji pewnie dostalbys, po lapach za toctou: https://en.wikipedia.org/wiki/Time-of-check_to_time-of-use


EDIT:
Jako ze odpowiedz jest troche bardziej skomplikowana to odpisze na komentarz tutaj.

Czas dostepu nie ma dzisiaj wiekszego znaczenia poza bardzo waskimi przypadkami. Problem jest po stronie security.

Jesli pierwsze sprawdzasz czy plik istnieje a potem ladujesz go, to masz jakis czas miedzy tymi dwiema akcjami. W tym czasie plik mozna podmienic, mozna podlinkowac inny plik, mozna tez, podmienic w pamieci sciezke do pliku itp... Ewentualnie bledy spowodowane tym ze probujesz czytac plik ktorego nie masz moga eskalowac kolejne bledy, przepelniania buforow, jakies procedury panikowania itp...

Przyklad takiego realnego bledu spowodowanego TOCOU jest tutaj: https://cwe.mitre.org/data/definitions/367.html

Tutaj masz przyklad jak exploitowac taki podatny na toctou program: https://resources.infosecinstitute.com/topic/race-condition-toctou-vulnerability-lab/

Ale jesli uczysz sie programowania to wiedz ze jest taki blad, ale nie przejmuj sie nim zbytnio bo jakbys kazda rzecza sie tak przejmowal to nie napisalbys nigdy zadnego programu.

Jest taka zasada, ktora jest prawdziwa dla wiekszosci przypadkow:

Lepiej miec wolny toporny ale dzialajacy program po tygodniu pracy i poprawiac go z czasem niz idealny program bez bledow dzialajacy niczym demon predkosci po roku pracy ;) bo w te 11 miesiecy mozesz go zmonetyzowac ;)

6
zkubinski napisał(a):
    if(!loadJsonFile.exists() == true){

proponuję:

    if(!loadJsonFile.exists() == true == true == true){

tak, żeby mieć pewność (to się nawet kompiluje). :P

Na temat. Po co tak kombinować? Wystarczy przecież:

    if(loadJsonFile.open(QIODevice::ReadOnly | QIODevice::Text)){
        qDebug()<< "Plik wczytano";

        QByteArray loadData;
        loadData = loadJsonFile.readAll();

        QJsonDocument data;
        QJsonObject obj;
        data = QJsonDocument::fromJson(loadData);

        obj = data.object();
        qDebug()<< obj;
    }

Qt domyślnie wypisze przyczynę błędu w strumieniu błędów.

1

gdyby tylko czytało się dokumentację.
https://doc.qt.io/qt-5/qfile.html#details

1 użytkowników online, w tym zalogowanych: 0, gości: 1