Chtěl jsem si otestovat nový USB SSD disk. Vymazal jsem sektory na nulu (stačilo prvních pár tisíc), aby se netvářil jako zformátovaný a aby Windows neblokovaly přístup k některým oblastem. Na začátek každého sektoru potom zapíšu číslo sektoru, čas a datum. Zapisuji v blocích po 256 sektorech.
Přístup k souboru:
DriveHandle:=CreateFile(PChar('\\.\PHYSICALDRIVE'+IntToStr(i)), GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ ,nil, OPEN_EXISTING, 0, 0)
Nejprve nastavím file pointer na počáteční sektor pro zápis:
SetFilePointer(DriveHandle,Longint(DrivePos.LowPart),@DrivePos.HighPart,FILE_BEGIN);
Potom se v cyklu volá
WriteFile(DriveHandle,BufferW[0],BytesToWrite,BytesWritten,nil)
(kde BytesToWrite:=SectorsToWrite*SECTOR_SIZE).
Program krásně běží a zapisuje bez chyb, ale po následné kontrole jsem zjistil, že poslední zapsaný sektor na disku je 31 877 663 (dekadicky).
Pokud spustím znovu program, aby zapisoval od následujícího nezapsaného sektoru, program pomocí SetFilePointer správně nastaví file pointer a na správně místo správně zapíše celý blok dat (256 sektorů). Ačkoliv zápisový cyklus dále pokračuje (podle kontrolních výpisů bez chyb), na další sektory už zapsáno není. Při dalších pokusech se vždy jednou zapíše (popíše se dalších 256 sektorů) a konec. Pokud by WriteFile vrátila False, vypisuji chybu pomocí GetLastError, ale do chyby tento program vůbec nechodí. Vypadá to, jako by se od určitého sektoru špatně aktualizoval file pointer (ze začátku se správně automaticky posouvá o BytesToWrite (=BytesWritten). Nevím, jak zjistit aktuální pozici file pointeru (abych ji zkontroloval), umím ji pouze nastavit. Rozuměl bych tomu, kdyby byl disk fyzicky vadný, jenže při každém spuštění zápisu postoupí zapsaná oblast o dalších 256 sektorů (1 blok) a dále se zápisy neprovádějí.
Nevíte někdo, jestli má funkce WriteFile nějaký limit pro zápis do velikých souborů/disků? A jak tento limit obejít? Nebo se jedná o jiný problém? Díky za odpovědi.