Π ΡΠ»ΡΡΠ°Π΅ ΡΠ°Π·ΡΠ΅ΠΆΠ΅Π½Π½ΡΡ ΡΠ°ΠΉΠ»ΠΎΠ² (sparse files), ΠΏΠΎΡΠ²ΠΈΠ²ΡΠΈΡ ΡΡ Π² Windows 2000, Π΄ΠΈΡΠΊΠΎΠ²ΠΎΠ΅ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ ΡΠ°ΡΡ ΠΎΠ΄ΡΠ΅ΡΡΡ Π»ΠΈΡΡ ΠΏΠΎ ΠΌΠ΅ΡΠ΅ Π·Π°ΠΏΠΈΡΠΈ Π΄Π°Π½Π½ΡΡ . ΠΠ΄ΠΌΠΈΠ½ΠΈΡΡΡΠ°ΡΠΎΡ ΠΌΠΎΠΆΠ΅Ρ Π½Π°Π·Π½Π°ΡΠ°ΡΡ, ΠΊΠ°ΠΊΠΈΠ΅ ΡΠ°ΠΉΠ»Ρ, ΠΊΠ°ΡΠ°Π»ΠΎΠ³ΠΈ ΠΈΠ»ΠΈ ΡΠΎΠΌΠ° Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ ΡΠ°Π·ΡΠ΅ΠΆΠ΅Π½Π½ΡΠΌΠΈ. ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, ΠΌΠΎΠΆΠ½ΠΎ Π½Π°Π·Π½Π°ΡΠΈΡΡ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΠΉ ΡΠ°ΠΉΠ» Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΡΠ°Π·ΡΠ΅ΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ DeviceIoControl, Π΅ΡΠ»ΠΈ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΠΏΡΠΈ Π΅Π΅ Π²ΡΠ·ΠΎΠ²Π΅ ΡΠ»Π°Π³ FSCTL_SET_SPARSE. Π‘ΠΈΡΡΠ°ΡΠΈΡ, Π² ΠΊΠΎΡΠΎΡΠΎΠΉ ΡΠ΄ΠΎΠ±Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ°Π·ΡΠ΅ΠΆΠ΅Π½Π½ΡΠ΅ ΡΠ°ΠΉΠ»Ρ, ΠΈΠ»Π»ΡΡΡΡΠΈΡΡΠ΅Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° 3.1. Π ΡΠ°Π·ΡΠ΅ΠΆΠ΅Π½Π½ΡΠΌ ΡΠ°ΠΉΠ»Π°ΠΌ ΡΡΠ½ΠΊΡΠΈΡ SetValidFileData Π½Π΅ΠΏΡΠΈΠΌΠ΅Π½ΠΈΠΌΠ°.
Π€Π°ΠΉΠ»Ρ FAT Π½ΡΠ»ΡΠΌΠΈ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ Π½Π΅ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΡΡΡΡ. Π‘ΠΎΠ³Π»Π°ΡΠ½ΠΎ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ Microsoft ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ Π²Π½ΠΎΠ²Ρ ΡΠΎΠ·Π΄Π°Π½Π½ΡΡ ΡΠ°ΠΉΠ»ΠΎΠ² Π½Π΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΎ, ΡΡΠΎ ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠΆΠ΄Π°Π΅ΡΡΡ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠ°ΠΌΠΈ. ΠΠΎΡΡΠΎΠΌΡ, Π΅ΡΠ»ΠΈ Π΄Π»Ρ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎΠΉ ΡΠ°Π±ΠΎΡΡ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΠ°ΠΉΠ»ΠΎΠ², ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΡΠΎ Π΄Π΅Π»Π°ΡΡ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ ΠΏΡΡΠ΅ΠΌ Π²ΡΠ·ΠΎΠ²Π° ΡΡΠ½ΠΊΡΠΈΠΈ WriteFile. Π€Π°ΠΉΠ»Ρ NTFS Π±ΡΠ΄ΡΡ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Ρ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΡΠΎΠ²Π΅Π½Ρ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ Π‘2, ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅ΠΌΡΠΉ Windows, ΡΡΠ΅Π±ΡΠ΅Ρ, ΡΡΠΎΠ±Ρ ΡΡΠ΅Π½ΠΈΠ΅ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ³ΠΎ ΡΠ΄Π°Π»Π΅Π½Π½ΡΡ ΡΠ°ΠΉΠ»ΠΎΠ² Π±ΡΠ»ΠΎ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠΌ.
ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ ΠΊΡΠΎΠΌΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ SetEndOfFile ΡΡΡΠ΅ΡΡΠ²ΡΡΡ ΠΈ Π΄ΡΡΠ³ΠΈΠ΅ ΡΠΏΠΎΡΠΎΠ±Ρ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΡ ΡΠ°Π·ΠΌΠ΅ΡΠ° ΡΠ°ΠΉΠ»Π°. Π’Π°ΠΊ, ΠΌΠΎΠΆΠ½ΠΎ ΡΠ°ΡΡΠΈΡΠΈΡΡ ΡΠ°ΠΉΠ», ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΡΠ΄ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ Π·Π°ΠΏΠΈΡΠΈ, Ρ ΠΎΡΡ ΠΏΡΠΈ ΡΡΠΎΠΌ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΡΠΈΡΠΊ ΡΠ²Π΅Π»ΠΈΡΠ΅Π½ΠΈΡ ΡΡΠ΅ΠΏΠ΅Π½ΠΈ ΡΡΠ°Π³ΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ ΡΠ°ΠΉΠ»Π°; ΡΠ°Π·ΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ Π½Π° Π΄ΠΈΡΠΊΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ² Π² Π²ΠΈΠ΄Π΅ Π½Π΅ΠΏΡΠ΅ΡΡΠ²Π½ΡΡ Π±Π»ΠΎΠΊΠΎΠ² Π±ΠΎΠ»ΡΡΠΎΠ³ΠΎ ΡΠ°Π·ΠΌΠ΅ΡΠ° ΡΡΠ½ΠΊΡΠΈΡ SetEndOfFile ΠΎΡΠ΄Π°Π΅Ρ Π½Π° ΠΎΡΠΊΡΠΏ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΠ΅.
ΠΡΠΈΠΌΠ΅Ρ: ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ Π·Π°ΠΏΠΈΡΠ΅ΠΉ, Π½Π°Ρ ΠΎΠ΄ΡΡΠΈΡ ΡΡ Π² ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΠΎΠΌ ΠΌΠ΅ΡΡΠ΅ ΡΠ°ΠΉΠ»Π°
ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° RecordAccess (ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° 3.1) ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΡ ΡΠ°ΠΉΠ»ΠΎΠ² ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΡΠ°Π·ΠΌΠ΅ΡΠ°, ΡΠΎΡΡΠΎΡΡΠΈΡ ΠΈΠ· Π·Π°ΠΏΠΈΡΠ΅ΠΉ ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΡΠ°Π·ΠΌΠ΅ΡΠ°. Π Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ΅ ΡΠ°ΠΉΠ»Π° Ρ ΡΠ°Π½ΠΈΡΡΡ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π½Π΅ΠΏΡΡΡΡΡ Π·Π°ΠΏΠΈΡΠ΅ΠΉ, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΡ ΡΡ Π² ΡΠ°ΠΉΠ»Π΅, Π° ΡΠ°ΠΊΠΆΠ΅ Π΅ΠΌΠΊΠΎΡΡΡ ΡΠ°ΠΉΠ»Π°. ΠΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅ΡΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ Π² ΠΈΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΠ²Π½ΠΎΠΌ ΡΠ΅ΠΆΠΈΠΌΠ΅ ΡΡΠ΅Π½ΠΈΠ΅, Π·Π°ΠΏΠΈΡΡ (ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅) ΠΈ ΡΠ΄Π°Π»Π΅Π½ΠΈΠ΅ Π·Π°ΠΏΠΈΡΠ΅ΠΉ, ΠΊΠ°ΠΆΠ΄Π°Ρ ΠΈΠ· ΠΊΠΎΡΠΎΡΡΡ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΠΌΠ΅ΡΠΊΠΈ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ, ΡΠ΅ΠΊΡΡΠΎΠ²ΡΡ ΡΡΡΠΎΠΊΡ ΠΈ ΡΡΠ΅ΡΡΠΈΠΊ, ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°ΡΡΠΈΠΉ, ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ°Π· Π·Π°ΠΏΠΈΡΡ ΠΈΠ·ΠΌΠ΅Π½ΡΠ»Π°ΡΡ. Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π½Π΅ΡΠ»ΠΎΠΆΠ½ΠΎΠ³ΠΎ ΠΈ ΡΠ΅Π°Π»ΠΈΡΡΠΈΡΠ½ΠΎΠ³ΠΎ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠ΅ΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ Π±Ρ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π² ΡΡΡΡΠΊΡΡΡΡ Π·Π°ΠΏΠΈΡΠΈ ΠΊΠ»ΡΡ ΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡ ΠΌΠ΅ΡΡΠΎΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π·Π°ΠΏΠΈΡΠ΅ΠΉ Π² ΡΠ°ΠΉΠ»Π΅ ΠΏΡΡΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ Ρ ΡΡ-ΡΡΠ½ΠΊΡΠΈΠΈ ΠΊ Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌ ΠΊΠ»ΡΡΠ°.
ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΡΠ΅Ρ ΠΏΠΎΠ·ΠΈΡΠΈΠΎΠ½ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ ΡΠ°ΠΉΠ»Π° ΠΏΠ΅ΡΠ΅Π΄ Π·Π°Π΄Π°Π½Π½ΠΎΠΉ Π·Π°ΠΏΠΈΡΡΡ, Π° ΡΠ°ΠΊΠΆΠ΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ 64-Π±ΠΈΡΠΎΠ²ΡΡ Π°ΡΠΈΡΠΌΠ΅ΡΠΈΡΠ΅ΡΠΊΠΈΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Π΄Π°Π½Π½ΡΡ ΡΠΈΠΏΠ° LARGE_INTEGER Microsoft Π‘. Π§ΡΠΎΠ±Ρ ΠΏΡΠΎΠΈΠ»Π»ΡΡΡΡΠΈΡΠΎΠ²Π°ΡΡ Π»ΠΎΠ³ΠΈΠΊΡ ΡΠ°Π±ΠΎΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΉ ΡΠ°ΠΉΠ»Π°, Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π²ΠΊΠ»ΡΡΠ΅Π½ ΠΊΠΎΠ΄, ΠΏΡΠΎΠ²Π΅ΡΡΡΡΠΈΠΉ Π½Π°Π»ΠΈΡΠΈΠ΅ ΠΎΡΠΈΠ±ΠΎΠΊ. ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π² ΡΠ΅Π»ΠΎΠΌ ΠΈΠ»Π»ΡΡΡΡΠΈΡΡΠ΅Ρ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²ΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΉ ΠΈ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π΅Π½Π½ΡΡ ΡΡΡΡΠΊΡΡΡ OVERLAPPED, Π° ΡΠ°ΠΊΠΆΠ΅ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ² Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ 64-Π±ΠΈΡΠΎΠ²ΡΡ ΡΠ°ΠΉΠ»ΠΎΠ²ΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΉ.
ΠΠ±ΡΠ΅Π΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π·Π°ΠΏΠΈΡΠ΅ΠΉ Π² ΡΠ°ΠΉΠ»Π΅ ΡΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠ΅; ΠΏΡΠΈ Π±ΠΎΠ»ΡΡΠΎΠΌ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π΅ Π·Π°ΠΏΠΈΡΠ΅ΠΉ ΡΠ°Π·ΠΌΠ΅ΡΡ ΡΠΎΠ·Π΄Π°Π²Π°Π΅ΠΌΡΡ ΡΠ°ΠΉΠ»ΠΎΠ² ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΠΎΡΠ΅Π½Ρ Π±ΠΎΠ»ΡΡΠΈΠΌΠΈ ΠΈ Π΄Π°ΠΆΠ΅ Π³ΠΈΠ³Π°Π½ΡΡΠΊΠΈΠΌΠΈ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π΄Π»ΠΈΠ½Π° ΠΎΠ΄Π½ΠΎΠΉ Π·Π°ΠΏΠΈΡΠΈ ΡΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ 300 Π±Π°ΠΉΡ. ΠΠΎΡΠ»Π΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΎΠ² Π²Ρ ΡΠ±Π΅Π΄ΠΈΡΠ΅ΡΡ, ΡΡΠΎ Π±ΠΎΠ»ΡΡΠΈΠ΅ ΡΠ°ΠΉΠ»Ρ Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ ΡΠ°Π·ΡΠ΅ΠΆΠ΅Π½Π½ΡΠΌ; Π² ΠΏΡΠΎΡΠΈΠ²Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ°Π·ΠΌΠ΅ΡΠ°ΡΡ ΠΈ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ Π½Π° Π΄ΠΈΡΠΊΠ΅ Π²Π΅ΡΡ ΡΠ°ΠΉΠ» ΡΠ΅Π»ΠΈΠΊΠΎΠΌ, Π² ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΡΠ΅Π³ΠΎ ΠΌΠΎΠΆΠ΅Ρ ΡΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎ ΡΠ²Π΅Π»ΠΈΡΠΈΡΡΡΡ Π²ΡΠ΅ΠΌΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΡΠ°ΠΉΠ»Π° ΠΈ Π·Π°Π½ΠΈΠΌΠ°Π΅ΠΌΠΎΠ΅ ΠΈΠΌ ΠΌΠ΅ΡΡΠΎ Π½Π° Π΄ΠΈΡΠΊΠ΅. Π₯ΠΎΡΡ Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ 3.1 ΡΡΠΎ ΠΈ Π½Π΅ ΠΎΡΡΠ°ΠΆΠ΅Π½ΠΎ, Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ ΠΏΡΠ΅Π΄ΡΡΠΌΠΎΡΡΠ΅Π½ ΡΡΠ°ΡΡΠΎΠΊ ΠΊΠΎΠ΄Π°, ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°ΡΡΠΈΠΉ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΡΠ°Π·ΡΠ΅ΠΆΠ΅Π½Π½ΡΡ ΡΠ°ΠΉΠ»ΠΎΠ², Π΅ΡΠ»ΠΈ Π² ΡΡΠΎΠΌ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΡ; Π² Π½Π΅ΠΊΠΎΡΠΎΡΡΡ ΡΠΈΡΡΠ΅ΠΌΠ°Ρ , Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Windows XP Home, ΡΡΠΎΡ ΠΊΠΎΠ΄ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π½Π΅ ΡΠΌΠΎΠΆΠ΅Ρ.
ΠΠ° Web-ΡΠ°ΠΉΡΠ΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΡΡΡΡ ΡΡΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΡΠΎΠ΄ΡΡΠ²Π΅Π½Π½ΡΠ΅ ΡΡΠΎΠΉ: tail.Ρ β Π΄ΡΡΠ³ΠΎΠΉ ΠΏΡΠΈΠΌΠ΅Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΠΎΠ³ΠΎ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ ΡΠ°ΠΉΠ»Ρ, getn.c β ΡΠΏΡΠΎΡΠ΅Π½Π½Π°Ρ Π²Π΅ΡΡΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ RecordAccess, ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°ΡΡΠ°Ρ Π»ΠΈΡΡ ΡΡΠ΅Π½ΠΈΠ΅ Π·Π°ΠΏΠΈΡΠ΅ΠΉ, ΠΈ atouMT (Π²ΠΊΠ»ΡΡΠ΅Π½Π° Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π΄Π»Ρ Π³Π»Π°Π²Ρ 14, Π½Π°Ρ ΠΎΠ΄ΡΡΠΈΠ΅ΡΡ Π½Π° Web-ΡΠ°ΠΉΡΠ΅, ΠΎΠ΄Π½Π°ΠΊΠΎ Π½Π΅ Π²ΠΊΠ»ΡΡΠ΅Π½Π° Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΡΠ΅ Π² ΠΊΠ½ΠΈΠ³Π΅), ΡΠ°ΠΊΠΆΠ΅ ΠΈΠ»Π»ΡΡΡΡΠΈΡΡΡΡΠ°Ρ ΠΏΡΡΠΌΠΎΠΉ Π΄ΠΎΡΡΡΠΏ ΠΊ ΡΠ°ΠΉΠ»Π°ΠΌ.
ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° 3.1. RecordAccess/* ΠΠ»Π°Π²Π° 3. RecordAccess. */
/* ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅: RecordAccess ΠΈΠΌΡ ΡΠ°ΠΉΠ»Π° [ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π·Π°ΠΏΠΈΡΠ΅ΠΉ]
ΠΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π·Π°ΠΏΠΈΡΠ΅ΠΉ (nrec) ΠΌΠΎΠΆΠ½ΠΎ Π½Π΅ ΡΠΊΠ°Π·ΡΠ²Π°ΡΡ, Π΅ΡΠ»ΠΈ ΡΠ°ΠΉΠ» Ρ ΡΠΊΠ°Π·Π°Π½Π½ΡΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ ΡΠΆΠ΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ. ΠΡΠ»ΠΈ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π·Π°ΠΏΠΈΡΠ΅ΠΉ (nrec) Π·Π°Π΄Π°Π½ΠΎ, ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ ΡΠ°ΠΉΠ» Ρ ΡΠΊΠ°Π·Π°Π½Π½ΡΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ (Π΅ΡΠ»ΠΈ ΡΠ°ΠΉΠ» Ρ ΡΠ°ΠΊΠΈΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ, ΠΎΠ½ ΡΠ½ΠΈΡΡΠΎΠΆΠ°Π΅ΡΡΡ). ΠΡΠΈ Π±ΠΎΠ»ΡΡΠΎΠΌ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π΅ Π·Π°ΠΏΠΈΡΠ΅ΠΉ (nrec) ΡΠ°ΠΉΠ»Ρ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΡΡΡ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΠΊΠ°ΠΊ ΡΠ°Π·ΡΠ΅ΠΆΠ΅Π½Π½ΡΠ΅. */
/* ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΈΠ»Π»ΡΡΡΡΠΈΡΡΠ΅Ρ:
1. ΠΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΡΠΉ Π΄ΠΎΡΡΡΠΏ ΠΊ ΡΠ°ΠΉΠ»Π°ΠΌ.
2. ΠΡΠΈΡΠΌΠ΅ΡΠΈΠΊΡ Π΄Π°Π½Π½ΡΡ ΡΠΈΠΏΠ° LARGE_INTEGER ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ 64-Π±ΠΈΡΠΎΠ²ΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΉ ΡΠ°ΠΉΠ»Π°.
3. ΠΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ Π·Π°ΠΏΠΈΡΠ΅ΠΉ Π½Π° ΠΌΠ΅ΡΡΠ΅.
4. ΠΠ°ΠΏΠΈΡΡ Π² ΡΠ°ΠΉΠ» Π½ΡΠ»Π΅ΠΉ Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ (ΡΡΠ΅Π±ΡΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΠ°ΠΉΠ»ΠΎΠ²ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΡ NTFS).
*/
#include "EvryThng.h"
#define STRING_SIZE 256
typedef struct _RECORD { /* Π‘ΡΡΡΠΊΡΡΡΠ° Π·Π°ΠΏΠΈΡΠΈ Π² ΡΠ°ΠΉΠ»Π΅ */
DWORD ReferenceCount; /* 0 ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ ΠΏΡΡΡΡΡ Π·Π°ΠΏΠΈΡΡ. */
SYSTEMTIME RecordCreationTime;
SYSTEMTIME RecordLastReferenceTime;
SYSTEMTIME RecordUpdateTime;
TCHAR DataString[STRING_SIZE];
} RECORD;
typedef struct _HEADER { /* ΠΠ΅ΡΠΊΡΠΈΠΏΡΠΎΡ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° ΡΠ°ΠΉΠ»Π° */
DWORD NumRecords;
DWORD NumNonEmptyRecords;
} HEADER;
int _tmain(int argc, LPTSTR argv[]) {
HANDLE hFile;
LARGE_INTEGER CurPtr;
DWORD FPos, OpenOption, nXfer, RecNo;
RECORD Record;
TCHAR String[STRING_SIZE], Command, Extra;
OVERLAPPED ov = {0, 0, 0, 0, NULL}, ovZero = {0, 0, 0, 0, NULL};
HEADER Header = {0, 0};
SYSTEMTIME CurrentTime;
BOOLEAN HeaderChange, RecordChange;
OpenOption = (argc == 2) ? OPEN_EXISTING : CREATE_ALWAYS;
hFile = CreateFile(argv[1], GENERIC_READ | GENERIC_WRITE, 0, NULL, OpenOption, FILE_ATTRIBUTE_NORMAL, NULL);
if (argc >= 3) { /* ΠΠ°ΠΏΠΈΡΠ°ΡΡ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ ΠΈ Π·Π°ΡΠ°Π½Π΅Π΅ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΡΠ°Π·ΠΌΠ΅Ρ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π° */
Header.NumRecords = atoi(argv[2]);
WriteFile(hFile, &Header, sizeof(Header), &nXfer, &ovZero);
CurPtr.QuadPart = sizeof(RECORD)*atoi(argv[2])+sizeof(HEADER);
FPos = SetFilePointer(hFile, CurPtr.LowPart, &CurPtr.HighPart, FILE_BEGIN);
if (FPos == 0xFFFFFFFF && GetLastError() != NO_ERROR) ReportError(_T("ΠΡΠΈΠ±ΠΊΠ° ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ."), 4, TRUE);
SetEndOfFile(hFile);
}
/* Π‘ΡΠΈΡΠ°ΡΡ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ ΡΠ°ΠΉΠ»Π°: ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π·Π°ΠΏΠΈΡΠ΅ΠΉ ΠΈ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π½Π΅ΠΏΡΡΡΡΡ Π·Π°ΠΏΠΈΡΠ΅ΠΉ. */
ReadFile(hFile, &Header, sizeof(HEADER), &nXfer, &ovZero);
/* ΠΡΠ΅Π΄Π»ΠΎΠΆΠΈΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΡΡΠΈΡΠ°ΡΡ ΠΈΠ»ΠΈ Π·Π°ΠΏΠΈΡΠ°ΡΡ Π·Π°ΠΏΠΈΡΡ Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΌ Π½ΠΎΠΌΠ΅ΡΠΎΠΌ. */
while(TRUE) {
HeaderChange = FALSE;
RecordChange = FALSE;
_tprintf(_Π’("ΠΠ²Π΅Π΄ΠΈΡΠ΅ r(ead)/w(rite)/d(elete)/q ΠΠ°ΠΏΠΈΡΡ#\n"));
_tscanf(_T("%c" "%d" "%c"), &Command, &RecNo, &Extra );
if (Command == 'q') break;
CurPtr.QuadPart = RecNo * sizeof(RECORD) + sizeof(HEADER);
ov.Offset = CurPtr.LowPart;
ov.OffsetHigh = CurPtr.HighPart;
ReadFile(hFile, &Record, sizeof(RECORD), &nXfer, &ov);
GetSystemTime(&CurrentTime); /* ΠΠ±Π½ΠΎΠ²ΠΈΡΡ ΠΏΠΎΠ»Ρ Π΄Π°ΡΡ ΠΈ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π² Π·Π°ΠΏΠΈΡΠΈ. */
Record.RecordLastRefernceTime = CurrentTime;
if (Command == 'r' || Command == 'd') { /*ΠΡΠ²Π΅ΡΡΠΈ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ Π·Π°ΠΏΠΈΡΠΈ.*/
if (Record.ReferenceCount == 0) {
_tprintf(_T("ΠΠ°ΠΏΠΈΡΡ Π½ΠΎΠΌΠ΅Ρ %d β ΠΏΡΡΡΠ°Ρ.\n"), RecNo);
continue;
} else {
_tprintf(_Π’("ΠΠ°ΠΏΠΈΡΡ Π½ΠΎΠΌΠ΅Ρ %d. ΠΠ½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΡΠ΅ΡΡΠΈΠΊΠ°: %d \n"), RecNo, Record.ReferenceCount);
_tprintf(_Π’("ΠΠ°Π½Π½ΡΠ΅: %s\n"), Record.DataString);
/* Π£ΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΠ΅: Π²ΡΠ²Π΅ΡΡΠΈ ΠΌΠ΅ΡΠΊΠΈ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ. Π‘ΠΌ. ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΠΏΡΠΈΠΌΠ΅Ρ. */
RecordChange = TRUE;
}
if (Command == 'd') { /* Π£Π΄Π°Π»ΠΈΡΡ Π·Π°ΠΏΠΈΡΡ. */
Record.ReferenceCount = 0;
Header.NumNonEmptyRecords--;
HeaderChange = TRUE;
RecordChange = TRUE;
}
} else if (Command == 'w') { /* ΠΠ°ΠΏΠΈΡΠ°ΡΡ Π΄Π°Π½Π½ΡΠ΅. ΠΠΏΠ΅ΡΠ²ΡΠ΅? */
_tprintf(_Π’("ΠΠ²Π΅Π΄ΠΈΡΠ΅ Π½ΠΎΠ²ΡΡ ΡΡΡΠΎΠΊΡ Π΄Π»Ρ Π·Π°ΠΏΠΈΡΠΈ.\n"));
_getts(String);
if (Record.ReferenceCount == 0) {
Record.RecordCreationTime = CurrentTime;
Header.NumNonEmptyRecords++;
HeaderChange = TRUE;
}
Record.RecordUpdateTime = CurrentTime;
Record.ReferenceCount++;
_tcsncpy(Record.DataString, String, STRING_SIZE-1);
RecordChange = TRUE;
} else {
_tprintf(_T("ΠΠΎΠΏΡΡΡΠΈΠΌΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ: r, w ΠΈ d. ΠΠΎΠ²ΡΠΎΡΠΈΡΠ΅ Π²Π²ΠΎΠ΄.\n"));
}
/* ΠΠ±Π½ΠΎΠ²ΠΈΡΡ Π·Π°ΠΏΠΈΡΡ Π½Π° ΠΌΠ΅ΡΡΠ΅, Π΅ΡΠ»ΠΈ Π΅Π΅ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΠΎΡΡ. */
if (RecordChange) WriteFile(hFile, &Record, sizeof(RECORD), &nXfer, &ov);
/* ΠΡΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ ΠΎΠ±Π½ΠΎΠ²ΠΈΡΡ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π½Π΅ΠΏΡΡΡΡΡ Π·Π°ΠΏΠΈΡΠ΅ΠΉ. */
if (HeaderChange) WriteFile(hFile, &Header, sizeof(Header), &nXfer, &ovZero);
}
_tprintf(_T("ΠΡΡΠΈΡΠ»Π΅Π½Π½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π½Π΅ΠΏΡΡΡΡΡ Π·Π°ΠΏΠΈΡΠ΅ΠΉ: %d\n"), Header.NumNonEmptyRecords);
CloseHandle(hFile);
return 0;
}
ΠΡΡΠΈΠ±ΡΡΡ ΡΠ°ΠΉΠ»ΠΎΠ² ΠΈ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π°ΠΌΠΈ
Π‘ΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΏΡΠΎΡΠΌΠΎΡΡΠ° ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π° Ρ ΡΠ΅Π»ΡΡ ΠΏΠΎΠΈΡΠΊΠ° ΡΠ°ΠΉΠ»ΠΎΠ² ΠΈ Π΄ΡΡΠ³ΠΈΡ ΠΊΠ°ΡΠ°Π»ΠΎΠ³ΠΎΠ², ΠΈΠΌΠ΅Π½Π° ΠΊΠΎΡΠΎΡΡΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡ Π·Π°Π΄Π°Π½Π½ΠΎΠΌΡ ΡΠ°Π±Π»ΠΎΠ½Ρ, ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ΠΌ Π°ΡΡΠΈΠ±ΡΡΠΎΠ² ΡΠ°ΠΉΠ»ΠΎΠ². ΠΠ»Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΠΎΠΈΡΠΊΠ° ΡΡΠ΅Π±ΡΠ΅ΡΡΡ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΠΏΠΎΠΈΡΠΊΠ° (search handle), ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌΡΠΉ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ FindFirstFile. ΠΠ»Ρ Π½Π°Ρ ΠΎΠΆΠ΄Π΅Π½ΠΈΡ ΡΠ°ΠΉΠ»ΠΎΠ², ΠΈΠΌΠ΅Π½Π° ΠΊΠΎΡΠΎΡΡΡ ΡΠ΄ΠΎΠ²Π»Π΅ΡΠ²ΠΎΡΡΡΡ Π·Π°Π΄Π°Π½Π½ΡΠΌ ΡΡΠ»ΠΎΠ²ΠΈΡΠΌ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ FindNextFile, Π° Π΄Π»Ρ ΠΏΡΠ΅ΠΊΡΠ°ΡΠ΅Π½ΠΈΡ ΠΏΠΎΠΈΡΠΊΠ° β ΡΡΠ½ΠΊΡΠΈΡ FindClose.