Portál AbcLinuxu, 9. května 2025 06:05

Dotaz: chyba při otevírání souboru "file.open(QIODevice::ReadOnly | QIODevice::Text)"

9.8.2011 14:32 Milan Bača | skóre: 2 | Valašské Meziříčí
chyba při otevírání souboru "file.open(QIODevice::ReadOnly | QIODevice::Text)"
Přečteno: 224×
Odpovědět | Admin
Mohl by mi někdo prosím pomoct? Externím programem plním textový soubor, který si hlídám pomocí 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();
        }
    }
}
Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

9.8.2011 22:14 T.O.M. | skóre: 22 | blog: T.O.M.'s blog | Ostrava
Rozbalit Rozbalit vše Re: chyba při otevírání souboru "file.open(QIODevice::ReadOnly | QIODevice::Text)"
Odpovědět | | Sbalit | Link | Blokovat | Admin

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

31.8.2011 10:56 Milan Bača | skóre: 2 | Valašské Meziříčí
Rozbalit Rozbalit vše Re: chyba při otevírání souboru "file.open(QIODevice::ReadOnly | QIODevice::Text)"
Zdravím, odebrání cesty problém nevyřešilo, jen se objevuje náhodně.

náhrada kódu
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

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.