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

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
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

user profile iconMartok hat folgendes geschrieben Zum zitierten Posting springen:
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();
}


user profile iconMartok hat folgendes geschrieben Zum zitierten Posting springen:
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 ;-)

user profile iconMartok hat folgendes geschrieben Zum zitierten Posting springen:
Eigentlich sollte das aber hinhauen, nachdem das Handle geschlossen wurde... :gruebel:

Ja, SOOO hab ich auch geschaut ;-)


Martok - Mi 11.07.12 17:42

user profile iconBenBE hat folgendes geschrieben Zum zitierten Posting springen:
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.