warten bis datei erstellt
-
Mein Programm erstellt eine Datei uund muss darauf zugreifen danach.
Ich bekomme allerdings eine Fehlermeldung weil der Programmablauf schneller ist wie das erstellen der Datei.Wie kann ich das Programm warten lassen bis die Datei fertig erstellt wurde um mit ihr zu arbeiten.
-
wie erstellst du denn die Datei, weil normalerweise ist die Datei erstellt, sobald die DateiErstellenFunktion() zurückkehrt.
greetz KN4CK3R
-
die datei ist als recource in meiner exe eingebunden. sie wird temporär entpackt , ausgeführt und danach soll sie wieder gelöscht werden.
ist eine exe.
ps: bevor fragen kommen nichts illegales oder ähnliches. Das ganze läuft auch nur firmenintern.
-
Hallo
Deine Beschreibung gibt uns aber immer noch keinen Anhaltspunkt für eine Hilfe. Solange du keinen Thread verwendest, sollte doch sowieso alles sequentiell ablaufen, und extra warten ist unnötig.
Zeig also mal den exakten Code vom "erstellen der Datei" und dem Übergang zum "zugreifen".bis bald
akari
-
Ok hier der Code:
HRSRC hRes; HRSRC hMem; DWORD sz_exe; hRes = FindResource( HInstance, "RD32", RT_RCDATA ); if ( hRes != NULL) { // Resource laden hMem = (HRSRC)LoadResource(HInstance, hRes); sz_exe = SizeofResource(HInstance, hRes); TMemoryStream* mstream = new TMemoryStream; mstream->Position = 0; mstream->WriteBuffer(hMem, sz_exe); // evtl. anderen Pfad festlegen AnsiString pfad = gibEnv(1)+ "\\OttoSoft\\Tools\\AppBlocker\\rd.exe"; mstream->SaveToFile(pfad); delete mstream; }
wenn ich versuche direkt danach darauf zuzugreifen sagt er mir die datei gibt es noch nicht. mache ich ein unelegantes Sleep(300) hin danach geht es.
Ich vermute Windows selbst braucht noch ein paar millisec dafür auch wenn der erfolgreich durchaufen wurde.
-
Mit der Funktion FileExists kann du prüfen, ob deine Datei erstellt ist.
zB.
bool exist = false; while (!exist) if (FileExists(pfad)) { exist = true; // exe starten ShellExecute(0, "open", pfad, NULL, NULL, SW_SHOWNORMAL); }
-
Für welche Zielplatform programmierst du? Ich denke für Windows.
Mit der WinApi gibt es dafür reichlich Unterstützung, z.B. WaitForSingleObject.
-
Das Problem wird wohl sein, dass da irgendein Caching Mechanismus im Hintergrund noch beschäftigt ist und du mit der VCL API darauf keinen Einfluss hast bzw. nicht feststellen kannst, wann die Datei tatsächlich vollständig geschrieben worden ist.
Versuch statt des MemStream Objektes doch mal Alternative wie ofstream oder WriteFile aus der Win32 API.