Ereignis/Test, ob fremder File-Write beendet wurde

Alles rund um die Programmierung mit Qt
Antworten
Cartman
Beiträge: 55
Registriert: 31. März 2006 16:55

Ereignis/Test, ob fremder File-Write beendet wurde

Beitrag 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?
Andy2211
Beiträge: 65
Registriert: 29. September 2008 23:02

Beitrag 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
Cartman
Beiträge: 55
Registriert: 31. März 2006 16:55

Beitrag 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.
Antworten