DeleteFile schlägt bei der zuletzt geschlossenen Datei fehl

7

Ich habe ein single-threaded-Programm (C ++, Win32, NTFS), das zuerst eine ziemlich lange temporäre Datei erstellt, schließt, öffnet zum Lesen, liest, schließt wieder und versucht mit DeleteFile() zu löschen.

Normalerweise läuft es reibungslos, aber manchmal DeleteFile( ) fehlschlägt, und GetLastError() gibt ERROR_ACCESS_DENIED zurück. Die Datei ist sicher nicht schreibgeschützt. Es passiert bei Dateien beliebiger Größe, aber die Wahrscheinlichkeit wächst mit der Dateigröße.

Irgendwelche Ideen, was die Datei sperren könnte? Ich habe versucht, WinInternals Tools zu überprüfen und nichts Verdächtiges gefunden.

    
Dmitry Shkolnik 18.11.2009, 02:20
quelle

6 Antworten

8

Nur eine wilde Vermutung - haben Sie eine Anti-Virus-Software installiert? Hast du versucht, irgendwelche Echtzeitschutzfunktionen darin zu deaktivieren, wenn du das tust?

    
Ori Pessach 18.11.2009 02:32
quelle
8

Windows ist für dieses Problem berüchtigt. sqlite behandelt das Problem, indem es die Löschoperation alle 100 Millisekunden wiederholt, bis zu einer maximalen Anzahl.

Ich glaube, wenn Sie sicher sind, dass Sie keine offenen Handles haben, wird Ihnen dies bei der Implementierung einige Kopfschmerzen ersparen, wenn Antivirus-Software die Datei öffnet.

Als Referenz den Kommentar von sqlite source:

%Vor%     
Snazzer 18.11.2009 04:34
quelle
4

Fügen Sie einen MessageBox () - Aufruf hinzu, bevor Sie DeleteFile () aufrufen. Wenn es angezeigt wird, führen Sie das sysinternals-Tool Process Explorer aus. Suchen Sie nach einem geöffneten Handle für die Datei. Wahrscheinlich haben Sie nicht alle Handles für die Datei geschlossen ...

    
rep_movsd 18.11.2009 02:24
quelle
3

Ich glaube, dass dies in Windows Internals behandelt wird. Die kurze Geschichte ist, dass, obwohl Sie CloseHandle auf dem Datei-Handle aufgerufen haben, der Kernel noch ausstehende Verweise haben kann, die ein paar Millisekunden zum Schließen benötigen.

Eine zuverlässigere Möglichkeit, die Datei zu löschen, wenn Sie fertig sind, besteht darin, das FILE_FLAG_DELETE_ON_CLOSE-Flag zu verwenden, wenn Sie das letzte Handle öffnen. Dies funktioniert sogar noch besser, wenn Sie vermeiden können, die Datei zwischen Lese- / Schreibvorgängen zu schließen.

%Vor%     
Nathan Howell 18.11.2009 06:55
quelle
1

Vielleicht sind die Änderungen noch zwischengespeichert und wurden noch nicht gespeichert?

Sie können dies überprüfen, indem Sie ein WaitForSingleObject im Dateihandle hinzufügen, um sicher zu sein.

    
Amirshk 18.11.2009 02:22
quelle
0
%Vor%     
Achrààf X-Ghôst 27.08.2012 01:17
quelle

Tags und Links