Zum Inhalt springen

C++: Fileverschieben funktioniert manchmal nicht


Empfohlene Beiträge

Geschrieben

Hallo,

ich habe ein kleines Problem und sehe die defekte Codestelle einfach nicht.

Vielleicht nimmt sich mal jemand kurz die Zeit und schaut darüber, andere sehen ja meistens den Fehler.

-----------------------------

Das Programm besteht aus folgenden Funktionen:

1) Die Xte Datei wir aus einem Ordner gelesen und gibt den Inhalt (ist nur eine Zeile) in einen String zurück. Übergeben wird an die Funktion der Ordner und die Nummer der Datei die ausgelesen werden soll.

Hierzu der Code:


Cstring met_func_getfilecontent(CString cst_func_folder, int int_func_filenum)

{

	WIN32_FIND_DATA win_func_findfiledata;

        HANDLE          han_func_hfind = INVALID_HANDLE_VALUE;

	CString         cst_func_folderorg = cst_func_folder;

	CString			cst_func_file;

	CString         cst_func_line;

	FILE			*fil_func_datafile;

	int				int_func_count = 0;

	char			cha_func_line [255];


	cst_func_folder = cst_func_folder + "*";


	han_func_hfind = FindFirstFile(cst_func_folder, &win_func_findfiledata);

	if (han_func_hfind != INVALID_HANDLE_VALUE)

	{

		while (FindNextFile(han_func_hfind, &win_func_findfiledata) != 0)

		{

			if ( int_func_count == int_func_filenum)

			{

				cst_func_file = cst_func_folderorg + win_func_findfiledata.cFileName;


				fil_func_datafile = fopen(cst_func_file,"r");	

				if(fil_func_datafile)

				{

					fgets(cha_func_line, 254, fil_func_datafile); 

					cst_func_line = cha_func_line;

					FindClose(han_func_hfind);

					fclose(fil_func_datafile);

					return cst_func_line;

				}

				else

				{

					FindClose(han_func_hfind);

					return "";

				}

				fclose(fil_func_datafile);

			}

			int_func_count++;

		}

		FindClose(han_func_hfind);

		return "";

	}

	else

	{

		FindClose(han_func_hfind);

		return "";

	}


}

Bis hier hin funktioniert alles wunderbar... 2) Nachdem die Datei erfolgreich gelesen wurde, wird sie in einen anderen Ordner archiviert. Es können auch mehrere Dateien in dem Ordner sein. Wenn die Archivierungsroutine aufgerufen wird, sollen alle Dateien in einen anderen Ordner verschoben werden. Übergeben wird der Quellordner und der Ordner in dem die Daten verschoben werden sollen. Hierzu der Code:

int met_func_archivefiles(CString cst_func_srcfolder, CString cst_func_destfolder)

{

	WIN32_FIND_DATA win_func_findfiledata;

    HANDLE          han_func_hfind = INVALID_HANDLE_VALUE;

	CString			cst_func_sourcefile;

	CString			cst_func_destfile;

	CString         cst_func_srcfind = cst_func_srcfolder;

	int				int_func_count = 0;


	cst_func_srcfind = cst_func_srcfind + "*";


	han_func_hfind = FindFirstFile(cst_func_srcfind, &win_func_findfiledata);

	if (han_func_hfind != INVALID_HANDLE_VALUE)

	{

		while (FindNextFile(han_func_hfind, &win_func_findfiledata) != 0)

		{

			if ( int_func_count >= 1)

			{

				cst_func_sourcefile = cst_func_srcfolder + win_func_findfiledata.cFileName;


				cst_func_destfile = cst_func_destfolder + win_func_findfiledata.cFileName;


				if (!MoveFileEx(cst_func_sourcefile, cst_func_destfile, MOVEFILE_REPLACE_EXISTING)) 

				{

					FindClose(han_func_hfind);

					return 1;

				}

			}

			int_func_count++;

		}

		FindClose(han_func_hfind);

	}

	else

	{

		FindClose(han_func_hfind);

		return 1;

	}

	return 0;

}

Nun ist folgendes Problem:

Manchmal passiert es das die Datei die zuvor gelesen wurde, zwar mit dem MoveFileEx in den andern Ordner gemoved wird, aber leider im Sourcefolder nicht gelöscht wird. D.h. die Datei steht im Archiv aber auch im Quellordner.

Wie kann das passieren?

Ich sehe meinen Fehler einfach nicht :(

Also Info noch: Die Datei die er aus dem Ordner auliest, wird von einem anderem Programm in den Ordner gestellt. D.h. ich scanne den Ordner zyklisch auf Dateien ab.

Wäre Euch sehr dankbar...

Geschrieben

Liefert MoveFileEx in so einem Fall denn FALSE zurück? Falls ja, lies den Fehlercode mit GetLastError aus.

Verschiebst du auf ein anderes Laufwerk?

Läuft irgendeine Antivirussoftware? Falls ja, versuch mal, die zu deaktivieren.

Geschrieben
Liefert MoveFileEx in so einem Fall denn FALSE zurück? Falls ja, lies den Fehlercode mit GetLastError aus.

Verschiebst du auf ein anderes Laufwerk?

Läuft irgendeine Antivirussoftware? Falls ja, versuch mal, die zu deaktivieren.

Ich kann leider nicht sagen was MoveFileEx zurückliefert, da ich den Fehler bei mir nicht simulieren kann. Es passiert nur beim Kunden :-(

Die Funktion met_func_archivefiles liefert aber als Returncode 0. Da im Log steht das das archivieren OK war... d.h. er geht niemals in den FALSE-Zweig (returncode 1)


if (!MoveFileEx(cst_func_sourcefile, cst_func_destfile, MOVEFILE_REPLACE_EXISTING)) 

				{

					FindClose(han_func_hfind);

					return 1;

				}

Ich verschiebe die Datei, z.B. von "C:\Temp\data" nach "C:\Temp\data_arch".

Es läuft auch eine Antivirensoftware ja? wieso?

Vielen Dank für die Hilfe :)

Geschrieben
Ich kann leider nicht sagen was MoveFileEx zurückliefert, da ich den Fehler bei mir nicht simulieren kann. Es passiert nur beim Kunden :-(
Das ist natürlich doof :(

Die Funktion met_func_archivefiles liefert aber als Returncode 0.
Dann ist MoveFileEx auch nicht fehlgeschlagen. Kannst du ausschließen, dass die Datei verschoben und gleich danach wieder erstellt wurde?

Es läuft auch eine Antivirensoftware ja? wieso?
Es kann sein, dass die Datei nicht gelöscht werden kann, weil die Antivirussoftware die Datei wegen des Zugriffs gerade prüft. Ich glaube aber, dass MoveFileEx dann fehlschlagen müsste.
Geschrieben

Das ist natürlich doof :(

Ja da hast du leider recht ;)

Dann ist MoveFileEx auch nicht fehlgeschlagen. Kannst du ausschließen, dass die Datei verschoben und gleich danach wieder erstellt wurde?

Ja das kann ich ausschliessen, da im Dateinamen ein Zeitstempel enthalten ist, und dieser identisch mit dem verschobenen File ist.

Es kann sein, dass die Datei nicht gelöscht werden kann, weil die Antivirussoftware die Datei wegen des Zugriffs gerade prüft. Ich glaube aber, dass MoveFileEx dann fehlschlagen müsste.

Werd ich den Kunden mal vorschlagen, oder zumindest das er den Ordner für den Scan ausnimmt

Das Programm läuft mit einer MFC GUI, wenn dieser Fall auftritt bleibt die GUI auch stehen. Soll heissen es werden keine Daten mehr an die GUI "gepumped", und sie reagiert mit "Keine Rückmeldung". Ich bin leider nicht der GUI Spezialist, aber wenn ich mir dann folgendes von der MoveFileEx Funktion durchlese:

MOVEFILE_REPLACE_EXISTING

If a file named lpNewFileName exists, the function replaces its contents with the contents of the lpExistingFileName file.

This value cannot be used if lpNewFileName or lpExistingFileName names a directory. The function does not return until the file is actually moved on the disk.

dann deuetet es schon darauf hin, das die Datei irgendwie nicht sauber gemoved werden kann. Warum allerdings dann die Methode met_func_archivefiles als Returncode 0 zurückgibts ist auch fraglich :-\

Geschrieben

Wenn MoveFileEx nicht zurückkommt, dann kann auch met_func_archivefiles nicht zurückkommen. Insofern sollte gar kein Rückgabewert zu sehen sein. Siehst du vielleicht den Rückgabewert vom vorausgegangenen Durchlauf? Kann es sein, dass met_func_archivefiles zweimal kurz nacheinander aufgerufen wird?

Geschrieben
Wenn MoveFileEx nicht zurückkommt, dann kann auch met_func_archivefiles nicht zurückkommen. Insofern sollte gar kein Rückgabewert zu sehen sein. Siehst du vielleicht den Rückgabewert vom vorausgegangenen Durchlauf? Kann es sein, dass met_func_archivefiles zweimal kurz nacheinander aufgerufen wird?

Vom Zeitstempel im Log und dem Filenamen sollte es kein vorausgegangener Durchlauf sein. Es ist aber so, dass der Ordner alle X Sekunden gescanned wird.

Wenn beim ersten Durchlauf das File nicht sauber gemoved wurde, könnte er beim 2ten Lauf mit den ausgelesenen Daten ein Problem bekommen.

Daraus würde dann diese Locksituation entstehen... Ich denke einfach mal das mit dem Virenscanner war ein guter Tipp ;) und ich werde es einfach mal versuchen.

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...