Открытие и считыванание файла в автоматическом режиме
Форумчане, столкнулся с проблемой открытия файла без участия пользователя. Принимаю файл с устройства по протоколу 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
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.Magst du es? In sozialen Netzwerken teilen!
Kommentare
- sdfsdfkp fgskpgokspdog
- 15. Oktober 2024 01:09
C++ - Тест 004. Указатели, Массивы и Циклы
- Ergebnis:90punkte,
- Bewertungspunkte8
- Максим Васильев
- 2. Oktober 2024 14:14
Qt - Тест 001. Сигналы и слоты
- Ergebnis:68punkte,
- Bewertungspunkte-1
- Лев Семенов
- 30. September 2024 21:04
C++ - Тест 001. Первая программа и типы данных
- Ergebnis:53punkte,
- Bewertungspunkte-4
Добрый день.
Думаю, что проблема не в том куске кода, который вы привели, а в том, который вызывает экспорт файла в csv формат. Если вы принимаете данные по TCP/IP, то, если я понимаю правильно, вы пытаетесь делать экспорт файла ещё до того, как изначальный файл вообще был принят. Думаю, что это не правильно. Вам нужно либо дождаться полной записи исходного файла, а потом уже выполнить его экспорт. Либо делать корректировку файла на лету без создания исходного файла.
Я бы вам предложил сначала реализовать первый вариант.