moo_kuh Geschrieben 6. Juni 2006 Geschrieben 6. Juni 2006 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... Zitieren
Klotzkopp Geschrieben 6. Juni 2006 Geschrieben 6. Juni 2006 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. Zitieren
moo_kuh Geschrieben 6. Juni 2006 Autor Geschrieben 6. Juni 2006 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 Zitieren
Klotzkopp Geschrieben 6. Juni 2006 Geschrieben 6. Juni 2006 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. Zitieren
moo_kuh Geschrieben 6. Juni 2006 Autor Geschrieben 6. Juni 2006 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 :-\ Zitieren
Klotzkopp Geschrieben 6. Juni 2006 Geschrieben 6. Juni 2006 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? Zitieren
moo_kuh Geschrieben 6. Juni 2006 Autor Geschrieben 6. Juni 2006 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. Zitieren
Empfohlene Beiträge
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.