Seite 1 von 1

QFile.copy - Datum der kopierten Datei

Verfasst: 21. Januar 2011 22:32
von sigvdr
Ich möchte einige Dateien kopieren und benutze dazu diese Function:

Code: Alles auswählen

int copyFile(QString fileName, QString fileDest) {
	int result = 0;
	QFile *file = new QFile(fileName);
	file->copy(fileDest);
	result = file->error();
	delete file;
	return result;
}
Als Ergebnis erhalte ich dann ( unter Linux ) Kopien der Originaldateien aber mit dem aktuellen Datum/Zeitstempel. Bei Windows erhält die Kopie den Zeitstempel der Originaldatei.

So setze ich jetzt auch bei Linux den Zeitstempel der Kopie auf den Wert der Originaldatei.

Code: Alles auswählen

int setTimeStamp(QString strFileName, int timeLastModified, int timeLastRead) {
// Unter Linux erhält eine kopierte Datei immer einen neuen Datumsstempel
// das muss hier korrigiert werden
#ifdef __unix__ 
	const char *fileName = strFileName.toLocal8Bit().data();
	struct utimbuf file_time;
	file_time.actime = timeLastRead;
	file_time.modtime = timeLastModified;
	return utime(fileName, &file_time);	
#else
	// zumindest die WIN-xxx Systeme behalten das Datum bei
	// es gibt also nichts zu tun
	return 0;
#endif 
}
Bei ca. 1-2% der kopierten Dateien erhalte ich (bei setTimeStamp) eine Fehlermeldung entsprechend: "Datei oder Verzeichnis nicht gefunden", obwohl die Datei vorher richtig kopiert wurde.

Da diese Fehlermeldungen nicht immer bei den gleichen Dateien kommen scheint ja sowas wie "fehlende Dateirechte" oder "Sonderzeichen im Dateinamen" hier nicht das Problem zu sein.
Versuchsweise hatte ich völlig erfolglos auch schon ewig lange Wartezeiten zw. Kopieren und Zeitsetzen eingefügt.

Frage1: Gibt es andere Möglichkeiten, die Zeit der Kopie gleich richtig zu setzen?
Frage2: Woher könnte mein Problem kommen? (evtl blockiert QFile.copy noch die Zieldatei)

Zur Info: Ich benutze z.Z. QT4.7 mit Ubuntu10.10

Gruß Sig

Verfasst: 22. Januar 2011 08:53
von Christian81
C++ Grundlagen...
Wie lange lebt wohl das QByteArray welches mit strFileName.toLocal8Bit() erzeugt wurde?

Des weiteren würde ich QFile nicht mit new anlegen sondern direkt auf dem Stack bzw. die statische QFile::copy() - Funktion benutzen

Verfasst: 22. Januar 2011 20:37
von sigvdr
Danke Christian, genau das war das Problem!

Hier war der Fehler:
const char *fileName = strFileName.toLocal8Bit().data();
Der Zeiger auf das QByteArray ist also schon in der nächsten Zeile undefiniert?

So geht das jetzt richtig!

Code: Alles auswählen

int setTimeStamp(QString strFileName, int timeLastModified, int timeLastRead) {
// Unter Linux erhält eine kopierte Datei immer einen neuen Datumsstempel
// das muss hier korrigiert werden
#ifdef __unix__
   struct utimbuf file_time;
   file_time.actime = timeLastRead;
   file_time.modtime = timeLastModified;
   return utime(strFileName.toLocal8Bit().data(), &file_time);   
#else
   // zumindest die WIN-xxx Systeme behalten das Datum bei
   // es gibt also nichts zu tun
   return 0;
#endif
} 
Gruß Sig

Verfasst: 22. Januar 2011 21:42
von Christian81
Richtig, genau das ist das Problem.
Du kannst Dich im übrigens rühmen - Du bist der erste der von allein drauf gekommen ist - das Problem taucht ungefähr einmal im Monat auf aber mein Kommentar wird irgendwie nie verstanden :)