Portál AbcLinuxu, 9. května 2025 06:05
QFileSystemWatcher
. Když se v něm něco objeví tak chci načíst všechny řádky a hned jej zase vymazat.
Při prvním naplnění souboru, QFileSystemWatcher
změnu souboru odchytí a spustí metodu checkFile()
, která spustí metodu loadFile(STACK_FILE_PATH)
. A tady nastává chyba. Soubor se neotevře jen pro čtení a hned se vymaže. V logu se mi objeví "Proces nemá přístup k souboru, neboť jej právě využívá jiný proces.". Při dalším naplnění souboru už vše funguje jak má. Už opravdu netuším co dělám špatně. Mohl by mě někdo nakopnout správným směrem? děkuji
QFileSystemWatcher *fileWatcher; fileWatcher = new QFileSystemWatcher(this); fileWatcher->addPath(STACK_FILE_PATH); connect(fileWatcher, SIGNAL(fileChanged(QString)), this, SLOT(checkFile())); void Controller::checkFile() { if (connectionState) fileSystem->loadFile(STACK_FILE_PATH); } void FileSystem::loadFile(const QString &fileName) { QFile file(fileName); QStringList pathsList; if (file.exists() && (file.size() > 0)) { if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { emit newLog(tr("Čtení")); emit newLog(file.errorString()); } else { QTextStream out(&file); while (!out.atEnd()) { QString line = out.readLine(); pathsList << line; } emit newListForCheck(pathsList); file.close(); } if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { emit newLog(tr("Výmaz")); emit newLog(file.errorString()); } else { QTextStream in(&file); in << ""; file.close(); } } }
S QFileSystemWatcher
můžeš narazit na spoustu problémů lišících se platformu od platformy. Mně se osvědčilo vždy na začátku slotu napojeném na fileChanged
/directoryChanged
cestu z "wočru" odebrat, provést co je třeba a na konci slotu cestu znovu přidat. Stávalo se mi v některých případech, že signál o změně přišel jen jednou. Možná to vyřeší tvůj problém s omezeným přístupem k souboru.
Ještě pár tipů:
while (!out.atEnd()) { QString line = out.readLine(); pathsList << line; }bych nahradil za:
while (file.canReadLine()) { QString line = out.readLine(); pathsList << line; }a smazat obsah souboru jde lépe:
if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate)) { emit newLog(tr("Výmaz")); emit newLog(file.errorString()); } else { file.close(); }
while (!out.atEnd()) { QString line = out.readLine(); pathsList << line; }za
while (file.canReadLine()) { QString line = out.readLine(); pathsList << line; }nefunguje, ale to mě zas tak netrápí jak to sledování souboru
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.