QFile.copy - Datum der kopierten Datei

Alles rund um die Programmierung mit Qt
Antworten
sigvdr
Beiträge: 100
Registriert: 1. Juli 2008 19:29

QFile.copy - Datum der kopierten Datei

Beitrag 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
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
sigvdr
Beiträge: 100
Registriert: 1. Juli 2008 19:29

Beitrag 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
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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 :)
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Antworten