Otkud to da je situacija gdje nije bitno, dapače. Sve rađeno po IDE standardu i sve super radi kada se disk ubaci u računalo.
Da, implementirao sam za NTFS. I da nema potrebe da se duplo upisuje (100%) iako si ti tvrdio da se tako mora. Sada navodiš nestanak struje kao razlog.
IDE je standard za komunikaciju s diskom. Ti možeš na disk pisati raw podatke bez da imaš ikakvu logičku strukturu u vidu particija i filesystema, to je i dalje u skladu s IDE (odnosno, da budemo precizniji, ATA) standardom, što je u skladu s IDE standardom, a primjenjivo za slučaj diska koji radi u nekom uređaju specijalne namjene i nema potreba direktnom pristupu disku putem računala ili se u slučaju takvog pristupa koristi specijalizirani software.
Ako programiraš neki kontroler koji će koristiti standardni filesystem, onda nije bitno ako ćeš odstupiti od standarda tog filesystema sve dok znaš koje posljedice mogu biti i da iste neće utjecati na sigurnost i pouzdanost, te da će disk biti u "čistom" stanju kad ga ubaciš u računalo. Znači, ako si ti programirao neki mikrokontroler da zapisuje na disk koji služi samo tome, te evenutalni prethodni podaci su ionako samo prethodni podaci tog uređaja i nije bitno ako ostanu na disku, to odstupa od standarda, ali za taj scenarij nije bitno. Iako ne vidim zašto bi unaprijed uopće alocirao veći file jer ne vidim scenarij u kojem bi to bilo korisno.
Međutim, ako radiš u višekorisničkom okruženju u kojem aplikacije nemaju pravo direktnog raw pristupa disku (osim ako se radi o dijelu OS-a ili specijaliziranim alatima koji zahtjevaju privilegirani mod rada), onda je nulliranje unaprijed alociranog prostora pod must (iz razloga koji ti je već ukazan na temi), te se o tome brine driver ili systemski API (što ti je također već pokazano na temi).
Ono što tebe tu vjerojatno buni je upravo to u alociranje unaprijed. Kad pišeš u file normalno, pišeš u buffer, flushaš podatke na disk, te se ti podaci zapišu direktno na disk, bez pisanja nula prije i tu stvarno nema potrebe za pisanjem nula. Međutim, ako pomakneš pointer, ti API-u kažeš "ej, ovaj mi prostor treba, ali u njega ću pisati kasnije", u tom slučaju će API napraviti jednu od dvije stvari:
- ili će na taj prostor upisati nule, ako se ne radi o sparse fileu (sparse file mora biti podržan i zatražen)
- ili će, u slučaju sparse filea, taj prostor u lookup tablici samo označiti da sadrži nule
Ako taj segment pokušaš čitati prije nego u njega pišeš, dobiti ćeš nule, i to iz dva razloga:
- sigurnosni, koji smo ti već objasnili
- konzistencije - uvijek se nastoji da sve operacije imaju poznati rezultat