Da, acest lucru se datorează faptului că procesul încă scrie în fișier și buffer-urile nu sunt golite.
De obicei, atunci când doriți să scrieți într-un fișier, puteți (aproximativ) să faceți ceva de genul:
1. Creați/Deschideți un fișier și preluați un „canal” (un mâner) către fișier
2. Scrie ceva
3. Goliți tamponul/Închideți fișierul „canal” (mâner) (=comitați pe disc)
(apoi, repeta 1, 2 si 3 cand vrei sa scrii ceva din nou)
Totuși, să faci așa ceva este în regulă dacă vrei să scrii ceva din când în când, deoarece „Deschiderea mânerului la fișier” și „Spălarea bufferelor” nu este „gratuit” când vine vorba de performanță.
Aceasta înseamnă că, dacă intenționați să scrieți frecvent într-un fișier, este mai bine să faceți doar Creați/Deschideți un fișier
, atunci Scrie
de mai multe ori, după cum este necesar și când ați terminat Culoare
sau Închideți mânerul (în exemplul meu de mai sus, aceasta înseamnă 1
, 2
[repetă pasul 2
după cum este necesar], apoi, mai târziu, 3
)
Și în timp ce datele nu sunt spălate pe disc/comitate: nu vă puteți baza pe ele!
Microsoft oferă mai multe detalii despre asta:
Spălarea datelor I/O stocate în tampon de sistem pe disc
[...] Windows stochează datele în operațiuni de citire și scriere a fișierelor în buffer-uri de date întreținute de sistem pentru a optimiza performanța discului. Când o aplicație scrie într-un fișier, sistemul de obicei pune în tampon datele și le scrie pe disc în mod regulat[...]
The FlushFileBuffers Documentul API Windows spune:
[...] În mod obișnuit, funcțiile WriteFile și WriteFileEx scriu date într-un buffer intern pe care sistemul de operare le scrie în mod regulat pe un disc sau conductă de comunicare. Funcția FlushFileBuffers scrie toate informațiile din buffer pentru un fișier specificat pe dispozitiv sau conductă.
Datorită interacțiunilor de stocare în cache a discului în cadrul sistemului, funcția FlushFileBuffers poate fi ineficientă atunci când este utilizată după fiecare scriere pe un dispozitiv de unitate de disc când multe scrieri sunt efectuate separat.[...]
CreateFile documentație:
[...] Când o aplicație se termină folosind mânerul de obiect returnat de CreateFile, utilizați funcția CloseHandle pentru a închide mânerul. Acest lucru nu numai că eliberează resurse de sistem, dar poate avea o influență mai largă asupra unor lucruri precum partajarea fișierului sau dispozitivului și trimiterea datelor pe disc. Specificațiile sunt menționate în acest subiect, după caz.[...]
Mai multe informații despre Memorarea în cache a fișierelor este disponibilă aici, Rețineți că:
Metadatele sistemului de fișiere sunt întotdeauna stocate în cache. Prin urmare, pentru a stoca orice modificări ale metadatelor pe disc, fișierul trebuie fie să fie șters, fie să fie deschis cu FILE_FLAG_WRITE_THROUGH.
Așadar, după cum puteți vedea, comportamentul depinde de designul aplicației, nu este neobișnuit să vedeți că fișierele jurnal sunt șterse pe disc doar o dată din când în când din motive de performanță și nu vă puteți baza pe metadate precum data/data/ timpul, dimensiunea fișierului sau chiar conținutul fișierului în timp ce aplicația încă scrie în fișier.