Entwickler-Ecke
Windows API - Geschriebene Datei wird nicht gefunden
BenBE - Mi 11.07.12 16:23
Titel: Geschriebene Datei wird nicht gefunden
Heute mal ein etwas seltsameres Problem. Nein, ich meine nicht Windows, ist aber mit diesem verwandt.
Grundlegend geht es darum:
- Ich habe zwei Programme A und B, Programm A läuft aktuell
- In Programm A lade ich Programm B und A' herunter (und überprüfe die Integrität)
- In Programm A schreibe ich B und A' auf Festplatte. Das Schreiben ist erfolgreich
- Programm A startet Programm B mit Kommandozeile "B A A'" und beendet sich dann
- Programm B startet und wartet darauf, dass A beendet ist (A hält einen Mutex)
- Programm B wertet die Parameter aus und prüft, ob UAC nötig ist
- Programm B übersetzt Laufwerkspfade in UNC-Pfade um um einen Bug in Windows herumzuarbeiten (Laufwerks-Mappings sind pro User, was zu Problemen bei UAC führt)
- Prüfen, ob Dateien existieren --> Sporadischer Fehler, dass A' fehlt
- Programm B benennt A nach A.backup um (erfolgreich)
- Programm B benennt A' nach A um (schlägt sporadisch fehl)
- Programm B löscht A.backup
- Wenn fehlgeschlagen und UAC möglich, bisherigen Ablauf mit UAC erneut probieren (B wartet hier auf sich selbst zur Synchronisation)
- Programm B startet A (also entweder ursprüngliches A oder A')
Soweit so einfach. Halt ein normaler Updater. Interessant ist nun, dass die neue Datei sporadisch nicht "existiert", obwohl diese laut Protokoll erfolgreich geschrieben wird.
Jemand von euch eine Idee, wo man da suchen kann? Ach ja: Problem tritt NUR auf XP auf und auch dort immer nur exakt einmal (AKA SEHR selten AKA am Tag vielleicht einmal reproduzierbar).
jaenicke - Mi 11.07.12 17:00
Spontan würde ich auf ein Antivirenprogramm tippen. Die Verhaltensanalyse schlägt da ja immer wieder mal unvorhersehbar zu.
BenBE - Mi 11.07.12 17:13
jaenicke hat folgendes geschrieben : |
Spontan würde ich auf ein Antivirenprogramm tippen. Die Verhaltensanalyse schlägt da ja immer wieder mal unvorhersehbar zu. |
Hab ich auch zuerst vermutet, konnte ich aber recht schnell ausschließen indem ich das auf einem blanken WinXP getestet hab. Da tritt der Fehler auch auf.
Konnte den Fehler inzwischen schon ein bisschen genauer eingrenzen, indem ich in Programm B nach Beenden von A etwa eine Sekunde warte: Interessanter Weise tritt dann der Fehler immer auf. Ich untersuch da grad eine Vermutung bzgl. der Flags bei CreateFile, mit denen die Dateien rausgeschrieben werden. B und A' liegen im mit GetTempPath ermittelten Verzeichnis und werden nämlich wirklich korrekt rausgeschrieben; kann man sogar im Explorer sehen.
Martok - Mi 11.07.12 17:18
Was für Flags übergibst du denn?
Außerdem wäre ein FlushFileBuffers mal noch interessant, den Effekt hatte ich auch schon, dass ein anderer Prozess die Datei nicht gesehen hat, weil sie nur im Filecache existiert hat und noch nicht auf der Platte war. Eigentlich sollte das aber hinhauen, nachdem das Handle geschlossen wurde... :gruebel:
BenBE - Mi 11.07.12 17:29
Martok hat folgendes geschrieben : |
Was für Flags übergibst du denn? |
Keine speziellen:
C++-Code:
1: 2: 3: 4: 5:
| std::fstream file( newPath, std::fstream::out | std::fstream::binary ); if( file.is_open() ) { file << download->GetData(); file.close(); } |
Martok hat folgendes geschrieben : |
Außerdem wäre ein FlushFileBuffers mal noch interessant, den Effekt hatte ich auch schon, dass ein anderer Prozess die Datei nicht gesehen hat, weil sie nur im Filecache existiert hat und noch nicht auf der Platte war. |
Interessant ist ja, dass sie nicht mehr auf der Platte ist ;-)
Martok hat folgendes geschrieben : |
Eigentlich sollte das aber hinhauen, nachdem das Handle geschlossen wurde... :gruebel: |
Ja, SOOO hab ich auch geschaut ;-)
Martok - Mi 11.07.12 17:42
BenBE hat folgendes geschrieben : |
Interessant ist ja, dass sie nicht mehr auf der Platte ist ;-) |
D.h. sie ist erst da und dann nicht mehr?
Was sagt denn der Process Monitor, wer die löscht?
BenBE - Do 12.07.12 14:51
Entwarnung: Fehler wurde gefunden.
Ursache (ausreichend WTF bereithalten): Im Destruktor der Hauptprogramm-Klasse wurden die Überreste des letzten Updates aufgeräumt. Und seit sich die Anwendung durch einen Bugfix auch sauber beendet hat, ... Den Rest kann man sich denken.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!