ΠΠ°ΠΆΠ΄ΠΎΠΌΡ ΠΈΠ· ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π½Π½ΡΡ Π°ΡΡΠΈΠ±ΡΡΠΎΠ² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΠ΅Ρ Π±ΠΈΡ Π² Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΠΎΠΌ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ GetFileAttributes Π·Π½Π°ΡΠ΅Π½ΠΈΠΈ. ΠΠΎΡ ΠΎΡΡΡΠ²ΠΎΠΊ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡΠ΅ΠΉ, ΡΠ²Π»ΡΠ΅ΡΡΡ Π»ΠΈ ΡΠ°ΠΉΠ» ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠΌ:
...var attrs: DWORD;
begin
attrs := GetFileAttribute(PAnsiChar(\'C:\boot.ini\'));
if (attrs and FILE_ATTRIBUTE_SYSTEM <> 0) then {ΡΠ°ΠΉΠ» ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠΉ};
ΠΡΡΠΈΠ±ΡΡΡ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡΡΡ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ API-ΡΡΠ½ΠΊΡΠΈΠΈ SetFileAttributes. ΠΠ½Π° ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ Π΄Π²Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°: ΠΏΡΡΡ ΡΠ°ΠΉΠ»Π° ΠΈΠ»ΠΈ ΠΏΠ°ΠΏΠΊΠΈ (PChar) ΠΈ Π±ΠΈΡΠΎΠ²ΡΡ ΠΌΠ°ΡΠΊΡ Π°ΡΡΠΈΠ±ΡΡΠΎΠ². ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ 0 (False) Π² ΡΠ»ΡΡΠ°Π΅ Π½Π΅ΡΠ΄Π°ΡΠΈ ΠΈ Π½Π΅Π½ΡΠ»Π΅Π²ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π² ΠΏΡΠΎΡΠΈΠ²Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅.
ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π² ΡΡΠ½ΠΊΡΠΈΡ SetFileAttributes ΠΏΠ΅ΡΠ΅Π΄Π°Π΅ΡΡΡ ΠΌΠ°ΡΠΊΠ°, Ρ ΡΠ°Π½ΡΡΠ°Ρ ΡΠ²Π΅Π΄Π΅Π½ΠΈΡ ΡΡΠ°Π·Ρ ΠΎΠ±ΠΎ Π²ΡΠ΅Ρ Π°ΡΡΠΈΠ±ΡΡΠ°Ρ ΡΠ°ΠΉΠ»Π° ΠΈΠ»ΠΈ ΠΏΠ°ΠΏΠΊΠΈ, ΡΠΎ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡ Π°ΡΡΠΈΠ±ΡΡΡ Π½ΡΠΆΠ½ΠΎ Π°ΠΊΠΊΡΡΠ°ΡΠ½ΠΎ (ΡΡΠΎΠ±Ρ Π½Π΅ ΡΠ΄Π°Π»ΠΈΡΡ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΡΠ΅ ΡΠ°Π½Π΅Π΅). ΠΡΠΈΠΌΠ΅Ρ (ΠΎΡΡΡΠ²ΠΎΠΊ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ) Β«Π²ΠΊΠ»ΡΡΠ΅Π½ΠΈΡΒ» ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ Β«Π²ΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡΒ» Π΄ΡΡΠ³ΠΎΠ³ΠΎ Π°ΡΡΠΈΠ±ΡΡΠ° ΡΠ°ΠΉΠ»Π° ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 4.22 (ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° ΠΎΡΠΈΠ±ΠΎΠΊ Π΄Π»Ρ ΠΏΡΠΎΡΡΠΎΡΡ Π½Π΅ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΡΡ).
...ΠΠΈΡΡΠΈΠ½Π³ 4.22.
ΠΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π°ΡΡΠΈΠ±ΡΡΠΎΠ² ΡΠ°ΠΉΠ»Π°
var attrs: DWORD;
begin
attrs := GetFileAttributes(\'C:\text.txt\');
attrs := attrs or FILE_ATTRIBUTE_HIDDEN; //Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° Π°ΡΡΠΈΠ±ΡΡΠ° Β«ΡΠΊΡΡΡΡΠΉΒ»
attrs := attrs and not FILE_ATTRIBUTE_ARCHIVE; //Π‘Π½ΡΡΠΈΠ΅ Π°ΡΡΠΈΠ±ΡΡΠ° Β«Π°ΡΡ ΠΈΠ²Π½ΡΠΉΒ»
SetFileAttributes(\'C:\text.txt\', attrs);
ΠΠΎΠΈΡΠΊ Π² ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ ΠΏΠ°ΠΏΠΊΠ΅
ΠΠΎΠΈΡΠΊ Π² ΠΏΡΠ΅Π΄Π΅Π»Π°Ρ ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠ°ΠΏΠΊΠΈ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ ΠΏΡΠΎΡΡΠΎΠΉ ΠΏΠ΅ΡΠ΅Π±ΠΎΡ Π²ΡΠ΅Ρ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π° Ρ ΠΎΡΠ±ΠΎΡΠΎΠΌ ΡΠ΅Ρ , ΠΈΠΌΠ΅Π½Π° ΠΊΠΎΡΠΎΡΡΡ ΡΠ΄ΠΎΠ²Π»Π΅ΡΠ²ΠΎΡΡΡΡ ΠΌΠ°ΡΠΊΠ΅ ΠΈ Π·Π°Π΄Π°Π½Π½ΠΎΠΌΡ Π½Π°Π±ΠΎΡΡ Π°ΡΡΠΈΠ±ΡΡΠΎΠ². Π ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π½ΠΈΠΆΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ (Π»ΠΈΡΡΠΈΠ½Π³4.23) ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ API-ΡΡΠ½ΠΊΡΠΈΡ FindFirstFile, ΠΊΠΎΡΠΎΡΠ°Ρ Π½Π°ΡΠΈΠ½Π°Π΅Ρ ΠΏΡΠΎΡΠΌΠΎΡΡ Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π°, Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΎΡΡΠ΅ΠΈΠ²Π°Ρ ΠΈΠΌΠ΅Π½Π° ΡΠ°ΠΉΠ»ΠΎΠ² ΠΈ ΠΏΠ°ΠΏΠΎΠΊ, Π½Π΅ ΡΠ΄ΠΎΠ²Π»Π΅ΡΠ²ΠΎΡΡΡΡΠΈ Ρ ΠΌΠ°ΡΠΊΠ΅. Π€ΡΠ½ΠΊΡΠΈΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ (THandle), ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠΉ Π΄Π»Ρ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ Π½Π°ΡΠ°ΡΠΎΠ³ΠΎ ΠΏΡΠΎΡΠΌΠΎΡΡΠ° ΠΏΠ°ΠΏΠΊΠΈ ΠΏΡΠΈ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠΈ ΠΏΠΎΠΈΡΠΊΠ° (Π² ΡΡΠ½ΠΊΡΠΈΠΈ FindNextFile).
ΠΠΎΡΠ»Π΅ ΠΎΠΊΠΎΠ½ΡΠ°Π½ΠΈΡ ΠΏΡΠΎΡΠΌΠΎΡΡΠ° ΠΏΠ°ΠΏΠΊΠΈ Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ FindClose, Π·Π°Π²Π΅ΡΡΠ°ΡΡΠ°Ρ ΠΏΡΠΎΡΠΌΠΎΡΡ ΠΏΠ°ΠΏΠΊΠΈ. ΠΡΠ΅Π½Ρ Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ ΡΠ°Π±ΠΎΡΡ Ρ ΠΎΠ±ΡΡΠ½ΡΠΌ ΡΠ°ΠΉΠ»ΠΎΠΌ (ΠΎΡΠΊΡΡΡΠΈΠ΅, ΠΏΡΠΎΡΠΌΠΎΡΡ, Π·Π°ΠΊΡΡΡΠΈΠ΅), Π½Π΅ ΡΠ°ΠΊ Π»ΠΈ?
...ΠΠΈΡΡΠΈΠ½Π³ 4.23.
ΠΠΎΠΈΡΠΊ Π² Π·Π°Π΄Π°Π½Π½ΠΎΠΉ ΠΏΠ°ΠΏΠΊΠ΅
function SearchInFolder(folder, mask: String; flags: DWORD;
names: TStrings; addpath: Boolean = False): Boolean;
var
hSearch: THandle;
FindData: WIN32_FIND_DATA;
strSearchPath: String;
bRes: Boolean; //ΠΡΠ»ΠΈ ΡΠ°Π²Π΅Π½ True, ΡΠΎ Π½Π°ΡΠ»ΠΈ Ρ ΠΎΡΡ Π±Ρ ΠΎΠ΄ΠΈΠ½
//ΡΠ°ΠΉΠ» ΠΈΠ»ΠΈ ΠΊΠ°ΡΠ°Π»ΠΎΠ³
begin
strSearchPath := folder + \'\\' + mask;
bRes := False;
//ΠΠ°ΡΠΈΠ½Π°Π΅ΠΌ ΠΏΠΎΠΈΡΠΊ
hSearch := FindFirstFile(PAnsiChar(strSearchPath), FindData);
if (hSearch <> INVALID_HANDLE_VALUE) then
begin
//ΠΡΠ΅ΠΌ Π²ΡΠ΅ ΠΏΠΎΡ ΠΎΠΆΠΈΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ (ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΠΏΠ΅ΡΠ²ΠΎΠΌ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ΅
//ΡΠΆΠ΅ Π·Π°ΠΏΠΈΡΠ°Π½Π° Π² FindData ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ FindFirstFile)
repeat
if (String(FindData.cFileName) <> \'..\') and
(String(FindData.cFileName) <> \'.\') then
//ΠΡΠΎΠΏΡΡΠΊΠ°Π΅ΠΌ . ΠΈ ..
begin
if MatchAttrs(flags, FindData.dwFileAttributes) then
begin
//ΠΠ°ΡΠ»ΠΈ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡΠΈΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ
if addpath then
names.Add(folder + \'\\' + FindData.cFileName)
else
names.Add(FindData.cFileName);
bRes := True;
end;
end;
until FindNextFile(hSearch, FindData) = False;
//ΠΠ°ΠΊΠ°Π½ΡΠΈΠ²Π°Π΅ΠΌ ΠΏΠΎΠΈΡΠΊ
FindClose(hSearch);
end;
SearchInFolder := bRes;
end;
Π Π΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠΌ ΡΠ°Π±ΠΎΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ SearchlnFolder ΡΠ²Π»ΡΠ΅ΡΡΡ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΡΠΏΠΈΡΠΊΠ° names ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ ΠΈΠ»ΠΈ, Π΅ΡΠ»ΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° addpath ΡΠ°Π²Π½ΠΎ True, ΠΏΠΎΠ»Π½ΡΠΌΠΈ ΠΏΡΡΡΠΌΠΈ Π½Π°ΠΉΠ΄Π΅Π½Π½ΡΡ ΡΠ°ΠΉΠ»ΠΎΠ² ΠΈ ΠΊΠ°ΡΠ°Π»ΠΎΠ³ΠΎΠ². ΠΠ½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° flags (Π±ΠΈΡΠΎΠ²Π°Ρ ΠΌΠ°ΡΠΊΠ° Π°ΡΡΠΈΠ±ΡΡΠΎΠ²) ΡΠΎΡΠΌΠΈΡΡΠ΅ΡΡΡ ΡΠ°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ Π΄Π»Ρ ΡΡΠ½ΠΊΡΠΈΠΈ SetFileAttributes. Π’ΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ Π»ΡΠ±ΡΠ΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΡΡΡΠΈΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡΠ° Π°ΡΡΠΈΠ±ΡΡΡ. ΠΡΠΈ Π½Π°Ρ ΠΎΠΆΠ΄Π΅Π½ΠΈΠΈ Ρ ΠΎΡΡ Π±Ρ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π° ΠΈΠ»ΠΈ ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π° SearchlnFolder Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ True.
Π ΡΡΠ½ΠΊΡΠΈΠΈ ΠΏΠΎΠΈΡΠΊΠ° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΡ Π°ΡΡΠΈΠ±ΡΡΠΎΠ² Π½Π°ΠΉΠ΄Π΅Π½Π½ΡΡ ΡΠ°ΠΉΠ»ΠΎΠ² ΠΈ ΠΊΠ°ΡΠ°Π»ΠΎΠ³ΠΎΠ² ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΡΡ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ MatchAttrs. ΠΠΎΠ΄ ΡΡΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 4.24.
...ΠΠΈΡΡΠΈΠ½Π³ 4.24.
Π€ΠΈΠ»ΡΡΡ Π°ΡΡΠΈΠ±ΡΡΠΎΠ²
function MatchAttrs(flags, attrs: DWORD): Boolean;
begin
MatchAttrs := (flags and attrs) = flags;
end;
ΠΠΎΠΆΠ΅Ρ ΠΏΠΎΠΊΠ°Π·Π°ΡΡΡΡ, ΡΡΠΎ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° ΠΈΠ· ΠΎΠ΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ β ΡΠ»ΠΈΡΠΊΠΎΠΌ ΡΠ»Π°Π±ΡΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ. Π ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅ΠΌΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΎΡΠ΄Π΅Π»ΡΠ½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ MatchAttrs Π²ΡΠ΄Π΅Π»Π΅Π½Π° Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΡΠ΄Π΅Π»Π°ΡΡ ΠΎΡΡΠ΅ΠΈΠ²Π°Π½ΠΈΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ² (ΠΈ ΠΏΠ°ΠΏΠΎΠΊ) ΠΏΠΎ Π°ΡΡΠΈΠ±ΡΡΠ°ΠΌ Π±ΠΎΠ»Π΅Π΅ ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΡΠΌ.
Π Π»ΠΈΡΡΠΈΠ½Π³Π΅ 4.24 ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π½Π΅ΡΡΡΠΎΠ³ΠΎΠ³ΠΎ ΡΠΈΠ»ΡΡΡΠ°: ΠΎΠ½ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΡΠ°ΠΉΠ» ΠΈΠ»ΠΈ ΠΏΠ°ΠΏΠΊΡ, Π΅ΡΠ»ΠΈ ΠΎΠ½ΠΈ ΠΈΠΌΠ΅ΡΡ Π²ΡΠ΅ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΡΠ΅ Π² flags Π°ΡΡΠΈΠ±ΡΡΡ, Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ ΠΎΡ Π½Π°Π»ΠΈΡΠΈΡ ΡΠ°ΠΉΠ»Π° ΠΈΠ»ΠΈ ΠΏΠ°ΠΏΠΊΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ Π°ΡΡΠΈΠ±ΡΡΠΎΠ². Π’Π°ΠΊ, Π΅ΡΠ»ΠΈ ΠΌΡ Π·Π°Π΄Π°Π»ΠΈ flags:= FILE_ATTRIBUTE_READONLY, ΡΠΎ Π±ΡΠ΄ΡΡ Π½Π°ΠΉΠ΄Π΅Π½Ρ ΠΊΠ°ΠΊ ΡΠ°ΠΉΠ»Ρ, ΡΠ°ΠΊ ΠΈ ΠΊΠ°ΡΠ°Π»ΠΎΠ³ΠΈ, Π° ΡΠ°ΠΊΠΆΠ΅ ΡΠΊΡΡΡΡΠ΅, ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠ΅ ΠΈ ΠΏΡΠΎΡΠΈΠ΅ ΡΠ°ΠΉΠ»Ρ, ΡΠ°ΠΊΠΆΠ΅ ΠΈΠΌΠ΅ΡΡΠΈΠ΅ Π°ΡΡΠΈΠ±ΡΡ FILE_ATTRIBUTE_READONLY. ΠΠ»Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΡΡΠΎΠ³ΠΎΠ³ΠΎ ΡΠΈΠ»ΡΡΡΠ° ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΡΡ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Π² ΡΡΠ½ΠΊΡΠΈΠΈ MatchAttrs ΠΏΡΠΎΡΡΡΠΌ ΡΠ°Π²Π΅Π½ΡΡΠ²ΠΎΠΌ: flags = attrs.
ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠΉ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΠΏΠΎΠΈΡΠΊΠ° Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΡΡΠ½ΠΊΡΠΈΠΈ SearchlnFolder ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡΡΡ Π½Π° ΡΠΈΡ. 4.5.
Π ΠΈΡ. 4.5. ΠΠΎΠΈΡΠΊ Π² Π·Π°Π΄Π°Π½Π½ΠΎΠΉ ΠΏΠ°ΠΏΠΊΠ΅
ΠΡΠΈΠΌΠ΅Ρ Π²ΡΠ·ΠΎΠ²Π° ΡΡΠ½ΠΊΡΠΈΠΈ SearchlnFolder (Π΄Π»Ρ ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ Π½Π° ΡΠΈΡ. 4.5 ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ) ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 4.25.
...ΠΠΈΡΡΠΈΠ½Π³ 4.25.
ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ SearchlnFolder
//ΠΠ°ΠΏΡΡΠΊ ΠΏΠΎΠΈΡΠΊΠ° ΡΠ°ΠΉΠ»Π° Π² Π·Π°Π΄Π°Π½Π½ΠΎΠΉ ΠΏΠ°ΠΏΠΊΠ΅
procedure TForm2.Button1Click(Sender: TObject);
var
flags: DWORD;
begin
//Π€ΠΎΡΠΌΠΈΡΡΠ΅ΠΌ Π½Π°Π±ΠΎΡ Π°ΡΡΠΈΠ±ΡΡΠΎΠ² (ΠΏΠΎ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΡΠΌ ΡΠ»Π°ΠΆΠΊΠ°ΠΌ Π½Π° ΡΠΎΡΠΌΠ΅)
flags := 0;
if (chkDirs.Checked) then flags := flags or FILE_ATTRIBUTE_DIRECTORY;
if (chkHidden.Checked) then flags := flags or FILE_ATTRIBUTE_HIDDEN;
if (chkSystem.Checked) then flags := flags or FILE_ATTRIBUTE_SYSTEM;
if (chkReadOnly.Checked) then flags := flags or FILE_ATTRIBUTE_READONLY;
if (chkArchive.Checked) then flags := flags or
FILE_ATTRIBUTE_ARCHIVE;
lblFound.Caption := \'ΠΠΎΠΈΡΠΊβ¦\
lstFiles.Clear;
Refresh;
//ΠΠΎΠΈΡΠΊ (ΡΠ°ΠΉΠ»Ρ Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΡΡΡ ΠΏΡΡΠΌΠΎ Π² ΡΠΏΠΈΡΠΎΠΊ Π½Π° ΡΠΎΡΠΌΠ΅)
if not SearchInFolder(txtFolder.Text, txtMask.Text, flags,
lstFiles.Items)
then
lblFound.Caption := \'ΠΠΎΠΈΡΠΊ Π½Π΅ Π΄Π°Π» ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠ²\'
else
lblFound.Caption := \'ΠΠ°ΠΉΠ΄Π΅Π½ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ²: \' +
IntToStr(lstFiles.Count);
end;
ΠΠΎΠΈΡΠΊ ΠΏΠΎ Π²ΡΠ΅ΠΌΡ Π΄Π΅ΡΠ΅Π²Ρ ΠΊΠ°ΡΠ°Π»ΠΎΠ³ΠΎΠ²
Π Π»ΠΈΡΡΠΈΠ½Π³Π΅ 4.26 ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡΡΡ ΠΎΠ΄Π½Π° ΠΈΠ· Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΉ ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΠΎΠ³ΠΎ ΠΏΠΎΠΈΡΠΊΠ° ΠΏΠΎ Π΄Π΅ΡΠ΅Π²Ρ ΠΊΠ°ΡΠ°Π»ΠΎΠ³ΠΎΠ². ΠΠ»Π³ΠΎΡΠΈΡΠΌ ΠΏΠΎΠΈΡΠΊΠ° ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ.
1. ΠΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΠΏΠΎΠΈΡΠΊ Π² ΠΏΠ°ΠΏΠΊΠ΅ folder (Π²ΡΠ΅ Π½Π°ΠΉΠ΄Π΅Π½Π½ΡΠ΅ ΡΠ°ΠΉΠ»Ρ ΠΈΠ»ΠΈ ΠΏΠ°ΠΏΠΊΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡΡΡ Π² ΡΠΏΠΈΡΠΎΠΊ names).
2. Π€ΡΠ½ΠΊΡΠΈΡ SearchlnTree Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠΎΠ΄ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π° BfoLder Π΄Π»Ρ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΡ ΠΏΠΎΠΈΡΠΊΠ° Π² ΠΏΠΎΠ΄Π΄Π΅ΡΠ΅Π²Π΅, ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΠΌΠΎΠΌ ΠΏΠΎΠ΄ΠΊΠ°ΡΠ°Π»ΠΎΠ³ΠΎΠΌ.
...ΠΠΈΡΡΠΈΠ½Π³ 4.26.
ΠΠΎΠΈΡΠΊ ΠΏΠΎ Π΄Π΅ΡΠ΅Π²Ρ ΠΊΠ°ΡΠ°Π»ΠΎΠ³ΠΎΠ²
function SearchInTree(folder, mask: String; flags: DWORD;
names: TStrings; addpath: Boolean = False): Boolean;
var
hSearch: THandle;
FindData: WIN32_FIND_DATA;
bRes: Boolean; //ΠΡΠ»ΠΈ ΡΠ°Π²Π΅Π½ True, ΡΠΎ Π½Π°ΡΠ»ΠΈ Ρ ΠΎΡΡ Π±Ρ ΠΎΠ΄ΠΈΠ½ ΡΠ°ΠΉΠ» ΠΈΠ»ΠΈ ΠΊΠ°ΡΠ°Π»ΠΎΠ³
begin
//ΠΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅ΠΌ ΠΏΠΎΠΈΡΠΊ Π² ΡΠ΅ΠΊΡΡΠ΅ΠΉ ΠΏΠ°ΠΏΠΊΠ΅
bRes := SearchInFolder(folder, mask, flags, names, addpath);
//ΠΡΠΎΠ΄ΠΎΠ»ΠΆΠΈΠΌ ΠΏΠΎΠΈΡΠΊ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΈΠ· ΠΏΠΎΠ΄ΠΊΠ°ΡΠ°Π»ΠΎΠ³ΠΎΠ²
hSearch := FindFirstFile(PAnsiChar(folder + \'\*\'), FindData);
if (hSearch <> INVALID_HANDLE_VALUE) then
begin
repeat
if (String(FindData.cFileName) <> \'..\') and
(String(FindData.cFileName) <> \'.\') then
//ΠΡΠΎΠΏΡΡΠΊΠ°Π΅ΠΌ . ΠΈ ..
begin
if (FindData.dwFileAttributes and
FILE_ATTRIBUTE_DIRECTORY <> 0)
then
//ΠΠ°ΡΠ»ΠΈ ΠΏΠΎΠ΄ΠΊΠ°ΡΠ°Π»ΠΎΠ³ β Π²ΡΠΏΠΎΠ»Π½ΠΈΠΌ Π² Π½Π΅ΠΌ ΠΏΠΎΠΈΡΠΊ
if SearchInTree(folder + \'\\' + String(FindData.cFileName),
mask, flags, names, addpath)
then
bRes := True;
end;
until FindNextFile(hSearch, FindData) = False;
FindClose(hSearch);
end;
SearchInTree := bRes;
end;
Π ΡΡΠ½ΠΊΡΠΈΠΈ SearchlnTree Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΏΡΠΎΡΠΌΠΎΡΡ ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π° folder Π²ΡΡΡΠ½ΡΡ (ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ API-ΡΡΠ½ΠΊΡΠΈΠΉ) ΠΈΠ· ΡΠΎΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΡΡΠΈ. ΠΡΠ»ΠΈ Π·Π°Ρ ΠΎΡΠΈΡΠ΅, ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ ΠΏΠΎΠΈΡΠΊ ΠΏΠΎΠ΄ΠΊΠ°ΡΠ°Π»ΠΎΠ³ΠΎΠ² ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ SearchlnFolder. ΠΡΠ°Π²Π΄Π°, ΠΏΡΠΈ ΡΡΠΎΠΌ Π½ΡΠΆΠ½ΠΎ Π±ΡΠ΄Π΅Ρ Π·Π°Π²Π΅ΡΡΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠΉ ΡΠΏΠΈΡΠΎΠΊ (TStringList) Π΄Π»Ρ ΡΠΎΡ ΡΠ°Π½Π΅Π½ΠΈΡ Π½Π°ΠΉΠ΄Π΅Π½Π½ΡΡ Π² ΡΠ΅ΠΊΡΡΠ΅ΠΌ ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π΅ ΠΏΠΎΠ΄ΠΊΠ°ΡΠ°Π»ΠΎΠ³ΠΎΠ². ΠΠ»Π΅ΠΌΠ΅Π½ΡΡ ΡΠΏΠΈΡΠΊΠ° Π±ΡΠ΄ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π·: Π΄Π»Ρ ΠΏΠΎΠΈΡΠΊΠ° Π² ΠΏΠΎΠ΄ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π°Ρ .
ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠΉ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΠΏΠΎΠΈΡΠΊΠ° Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΡΡΠ½ΠΊΡΠΈΠΈ SearchlnTree ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡΡΡ Π½Π° ΡΠΈΡ. 4.6.
Π ΠΈΡ. 4.6. ΠΠΎΠΈΡΠΊ ΠΏΠΎ Π΄Π΅ΡΠ΅Π²Ρ ΠΊΠ°ΡΠ°Π»ΠΎΠ³ΠΎΠ²
Π‘ Π½Π΅Π±ΠΎΠ»ΡΡΠΈΠΌΠΈ ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΈΡΠΌΠΈ Π°Π»Π³ΠΎΡΠΈΡΠΌ ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΠΎΠ³ΠΎ ΠΎΠ±Ρ ΠΎΠ΄Π° Π΄Π΅ΡΠ΅Π²Π° ΠΊΠ°ΡΠ°Π»ΠΎΠ³ΠΎΠ², ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΡΠΉ Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 4.25, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΈ ΠΏΡΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡΡ , ΠΎΡΠ»ΠΈΡΠ½ΡΡ ΠΎΡ ΠΏΡΠΎΡΡΠΎΠ³ΠΎ ΠΏΠΎΠΈΡΠΊΠ°: Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΡΠΈ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ ΠΈΠ»ΠΈ ΡΠ΄Π°Π»Π΅Π½ΠΈΠΈ Π΄Π΅ΡΠ΅Π²Π° ΠΊΠ°ΡΠ°Π»ΠΎΠ³ΠΎΠ². ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ Π½ΡΠΆΠ½ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π½Π°Π΄ ΠΊΠ°ΠΆΠ΄ΡΠΌ Π½Π°ΠΉΠ΄Π΅Π½Π½ΡΠΌ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠΌ.
ΠΠΎΡΡΡΠΎΠ΅Π½ΠΈΠ΅ Π΄Π΅ΡΠ΅Π²Π° ΠΊΠ°ΡΠ°Π»ΠΎΠ³ΠΎΠ²
Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΡΠΉ ΠΏΡΠΈΠΌΠ΅Ρ, ΠΎΡΠ½ΠΎΠ²Π°Π½Π½ΡΠΉ Π½Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΏΠΎΠΈΡΠΊΠ° SearchlnFolder, β ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΈΠ΅ Π΄Π΅ΡΠ΅Π²Π° ΠΊΠ°ΡΠ°Π»ΠΎΠ³ΠΎΠ² Π΄Π»Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ Π΄ΠΈΡΠΊΠ° (ΡΠΈΡ. 4.7).
Π ΠΈΡ. 4.7. ΠΠ΅ΡΠ΅Π²ΠΎ ΠΊΠ°ΡΠ°Π»ΠΎΠ³ΠΎΠ²
ΠΠ»Ρ ΠΏΡΠΎΡΡΠΎΡΡ (ΠΈ ΡΡΠΎΠ±Ρ Π½Π΅ ΠΎΡΠ²Π»Π΅ΠΊΠ°ΡΡ Π²Π½ΠΈΠΌΠ°Π½ΠΈΡ ΠΎΡ ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΈΡ Π΄Π΅ΡΠ΅Π²Π°) Π΄ΠΈΡΠΊ Π·Π°Π΄Π°Π΅ΡΡΡ Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ ΠΆΠ΅ΡΡΠΊΠΎ. ΠΡΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ ΡΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ ΠΈΡΠΏΡΠ°Π²ΠΈΡΡ (ΠΊΠ°ΠΊ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡ Π΄ΠΈΡΠΊΠΈ, Π²Ρ ΡΠΆΠ΅ Π·Π½Π°Π΅ΡΠ΅).
Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ ΡΠ°Π±ΠΎΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΏΠΎ ΠΏΠΎΡΡΠ΄ΠΊΡ. ΠΠ»Π΅ΠΌΠ΅Π½Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ TreeView Π½Π° ΡΠΎΡΠΌΠ΅ ΠΈΠΌΠ΅Π΅Ρ ΠΈΠΌΡ tree. Π‘ΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ ΡΠΏΠΈΡΠΊΠ° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ (ImageList), ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠΎΠ³ΠΎ Π΄Π΅ΡΠ΅Π²ΠΎΠΌ, ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ΠΎ Π½Π° ΡΠΈΡ. 4.8.
Π ΠΈΡ. 4.8. ΠΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ Π΄Π»Ρ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² Π΄Π΅ΡΠ΅Π²Π°ΠΠ΅ΡΠ²ΡΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ Π΄Π΅ΡΠ΅Π²Π° (ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΠ΅Ρ Π΄ΠΈΡΠΊΡ) ΠΎΠ±ΡΠ°Π·ΡΠ΅ΡΡΡ ΠΏΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΡΠΎΡΠΌΡ (Π»ΠΈΡΡΠΈΠ½Π³ 4.27).
...ΠΠΈΡΡΠΈΠ½Π³ 4.27.
Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° Π΄Π΅ΡΠ΅Π²Π° β Π΄ΠΈΡΠΊΠ°
procedure TForm3.FormCreate(Sender: TObject);
begin
//ΠΠΎΡΠ½Π΅Π²ΠΎΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ Π΄Π΅ΡΠ΅Π²Π° (Π΄ΠΈΡΠΊ)
root := tree.Items.Add(tree.Items.GetFirstNode, \'C:\');
root.ImageIndex := 0;
root.SelectedIndex := 0;
SetExpanded(root, False);
end;
ΠΠ΄Π΅ΡΡ ΠΈ Π΄Π°Π»Π΅Π΅ Π² ΠΏΡΠΈΠΌΠ΅ΡΠ΅ root ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π±ΡΡΡΡΠΎ ΠΏΠΎΠ»ΡΡΠ°ΡΡ Π΄ΠΎΡΡΡΠΏ ΠΊ ΠΊΠΎΡΠ½Π΅Π²ΠΎΠΌΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ Π΄Π΅ΡΠ΅Π²Π°. ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠ°Ρ Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 4.27 ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ° ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ Π΄Π»Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² Π΄Π΅ΡΠ΅Π²Π° (Π»ΠΈΡΡΠΈΠ½Π³ 4.28).
...ΠΠΈΡΡΠΈΠ½Π³ 4.28.
Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° Π΄Π΅ΡΠ΅Π²Π°
procedure TForm3.SetExpanded(Node: TTreeNode; isExpanded: Boolean);
begin
if isExpanded then
begin
//ΠΠΎΠ΄Π³ΠΎΡΠ°Π²Π»ΠΈΠ²Π°Π΅ΠΌ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΠΊ Π·Π°Π³ΡΡΠ·ΠΊΠ΅ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ³ΠΎ ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π°
Node.Data := Pointer(1);
Node.DeleteChildren;
end
else
begin
//Π‘ΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π° Π½Π΅ ΠΏΡΠΎΡΠΈΡΠ°Π½ΠΎ (ΠΈΠ»ΠΈ Π΅Π³ΠΎ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΎΠ±Π½ΠΎΠ²ΠΈΡΡ)