Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ «БистСмноС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² срСдС WindowsΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 21

Автор ДТонсон Π₯Π°Ρ€Ρ‚

Π’ случаС Ρ€Π°Π·Ρ€Π΅ΠΆΠ΅Π½Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² (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.