m
monevich29. März 2019 16:01

Открытие и считыванание файла в автоматическом режиме

Qt

Форумчане, столкнулся с проблемой открытия файла без участия пользователя. Принимаю файл с устройства по протоколу Tcp/Ip, ставится задача перевести принимаемый файл в автоматическом режиме в формат .csv(Excel). Проблема заключается в следующем, работа функции начинается после получения сигнала о получении файла, соответственно в теле функции произвожу проверку на существование самого файла в директории if(QFile::exists(asd)), проверка производится успешно, условие открытия файла так же всегда выполняется if(myFile.open(QIODevice::ReadWrite)), но в QByteArray не проивзодится запись, он пустой, соответственно и весь последующий алгоритм не работает. При этом, если я прохожу все этапы под отладчиком, с установкой точек останова, то ArrayB заполняется так как надо, т.е. он не пустой. Связываю данную проблему с тем, что выполнение функции просходит именно в момент создания файла, т.е. моё устройство успело только создать файл, а записать в него данные не успело, и происходит в этот момент запуск моей функции MainWindow::AutoExportCSVfile() .

void MainWindow::AutoExportCSVfile()
{ 
    QStringList listExcelExport;
    QString asd1;
    QByteArray arrayB;
    QString asd = LastDirectory +"/" + NewMeasurmentDLG.getFileName() ;    //LastDirectory = D:/Data , NewMeasurmentDLG.getFileName() = myNewFile.dat
    asd1 = asd;
    asd1.chop(3);
    asd1+="csv";
    qDebug()<<"File exists?"<<QFile::exists(asd);      //Debug = true , Run = true
    if(QFile::exists(asd))
    {
        QFile myFile(asd);
        qDebug()<<myFile.bytesAvailable();          //Debug = нужное количество байт , Run = 0
        if(myFile.open(QIODevice::ReadWrite))
        {
            qDebug()<<"File can read?"<<myFile.waitForReadyRead(3000);    //Debug = false , Run = false
            qDebug()<<"Open File? "<<myFile.isOpen();                     //Debug = true , Run = true
            arrayB=myFile.readAll();
            qDebug()<<"lenght arrayB?"<<arrayB.length();                  //Debug = нужная длинна , Run = 0
            myFile.close();
            listExcelExport= arrayB.split(QRegExp("[\r \n ;]+"), QString::SkipEmptyParts);
            QFile exportFile(asd1);
            if(exportFile.open(QIODevice::WriteOnly))                    //Debug = true , Run = true
            {
                QTextStream ts(&exportFile);

                qDebug()<<"Dlinna listExcelExport = "<<listExcelExport.length();               
                for(int c= 80; c<listExcelExport.length()-1;c+=2)
                {
                    strList<<listExcelExport[c] + ";" + listExcelExport[c+1] +";";
                }
                ts<<strList.join("\n");
                exportFile.close();
            }
            QString outS= "Файл " + asd1 + " успешно сохранён!";
            textStatusBar->setText(outS);                     //Вывод в строку состояния сообщения 

        }
    }
}

Пытался решить дануую проблему путём бесконечного цикла ожидания waitForReadyRead(-1), но цикл никогда не завершается, всегда условие false (При этом файл уже полностью получен)

for (;;)
    {
        if(myFile.waitForReadyRead(-1))
        {
            break;
        }
    }

Может кто сталкивался с подобным? Файл всегда имеет разную длинну, условие проверки по количеству байт тоже не сработает.

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

Magst du es? In sozialen Netzwerken teilen!

1
Evgenii Legotckoi
  • 29. März 2019 17:16

Добрый день.

Думаю, что проблема не в том куске кода, который вы привели, а в том, который вызывает экспорт файла в csv формат. Если вы принимаете данные по TCP/IP, то, если я понимаю правильно, вы пытаетесь делать экспорт файла ещё до того, как изначальный файл вообще был принят. Думаю, что это не правильно. Вам нужно либо дождаться полной записи исходного файла, а потом уже выполнить его экспорт. Либо делать корректировку файла на лету без создания исходного файла.

  • В первом случае нужно выполнять вызов метода AutoExportCSVfile() только после окончания передачи данных.
  • Во втором случае нужно модифицировать методы принимающие данные, листинга которых здесь нет.

Я бы вам предложил сначала реализовать первый вариант.

    Kommentare

    Nur autorisierte Benutzer können Kommentare posten.
    Bitte Anmelden oder Registrieren
    Letzte Kommentare
    A
    ALO1ZE19. Oktober 2024 18:19
    Fb3-Dateileser auf Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
    ИМ
    Игорь Максимов5. Oktober 2024 17:51
    Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
    d
    dblas55. Juli 2024 21:02
    QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
    k
    kmssr9. Februar 2024 05:43
    Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
    Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
    Jetzt im Forum diskutieren
    J
    JacobFib17. Oktober 2024 13:27
    добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
    JW
    Jhon Wick2. Oktober 2024 01: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 19:09
    Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
    F
    Fynjy22. Juli 2024 14:15
    при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

    Folgen Sie uns in sozialen Netzwerken