Seite 1 von 1

Ereignis/Test, ob fremder File-Write beendet wurde

Verfasst: 24. August 2009 23:30
von Cartman
Hallo,

ich lausche mit dem FileSystemWatcher auf ein Verzeichnis, wo ständig FTP-Files eingehen. Wenn ich weiß, daß ein neues File da ist, teste ich in einer Schleife mit open(QFile::WriteOnly), ob die Datei nun fertig hochgeladen ist (und der File-Lock endlich verschwunden ist). Dann kann ich selbst zugreifen (obwohl nur Lesezugriff von mir gewollt ist).

Gibt's hier ne elegantere Methode? Evtl. ohne Polling und mit Ereignissen? Wie würdet ihr das machen?

Verfasst: 26. August 2009 00:45
von Andy2211
Hi,
da sonst keiner was zu sagen hat mach ich das jetzt mal :)

So ne richtig elegante Lösung fällt mir jetzt im Moment auch nicht ein, du solltest aber auf jeden Fall einen Timer oder ein Sleep einbauen, damit du das System nicht nur mit pollen auslastest. Also wartezeit würd ich vielleicht die durchschnittliche Zeit von der durchschnittlichen Größe aller Files ranziehen

Gruß,
Andy

Verfasst: 26. August 2009 13:46
von Cartman
Danke für die Antwort. Jo, ich kenn mich da ein bissel aus.

Diese Art "Busy-waiting" hab ich in einem Thread laufen, wobei die dazugehörige Schleife auch regelmäßig 500 ms schläft. Zudem wird immer ein "bye-bye"-Boolean getestet, sodaß beim Quit vom User die Schleife immer sauber beendet wird (mit max. Verzögerung von 500 ms in diesem Fall).

Hier ist der Code zum Busy-waiting, denn ich gerne vermeiden würde:

Code: Alles auswählen

while(!file.open(QIODevice::ReadWrite) && !_bye)
{
	for(int i = 0; i  < 2 && !_bye; i++)
	{
		msleep(500);
		std::cout << "Datei noch besetzt!" << std::endl;
	}
}
Die innere Schleife ist nur zum schnellen Reagieren bei einem Quit vom Benutzer gedacht, ohne dabei zu hochfrequent die Datei pollen zu müssen.