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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Delphi. Π’Ρ€ΡŽΠΊΠΈ ΠΈ эффСкты». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 19

Автор Π’Π°Π»Π΅Ρ€ΠΈΠΉ Борисок

Рис. 4.4. ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡƒΡ‚Π΅ΠΉ

На всякий случай Π½ΡƒΠΆΠ½ΠΎ ΡƒΡ‚ΠΎΡ‡Π½ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π² ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΌ ΠΏΡƒΡ‚ΠΈ элСмСнт. ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ ΠΏΠ°ΠΏΠΊΡƒ (Π½ΠΈΠΊΡƒΠ΄Π° ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ Π½Π΅ Π½Π°Π΄ΠΎ), Π° элСмСнт. ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΏΠ°ΠΏΠΊΡƒ, Ρ€Π°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½Π½ΡƒΡŽ Π½Π° ΠΎΠ΄ΠΈΠ½ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ Π²Ρ‹ΡˆΠ΅ (Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΡƒΡŽ ΠΏΠ°ΠΏΠΊΡƒ). Π’Π°ΠΊΠΆΠ΅ слСдуСт ΡƒΡ‚ΠΎΡ‡Π½ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ΄ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½Ρ‹ΠΌ ΠΏΡƒΡ‚Π΅ΠΌ понимаСтся ΠΏΡƒΡ‚ΡŒ, ΠΊΠΎΡ€Π½Π΅Π²Ρ‹ΠΌ элСмСнтом ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ являСтся \\ ΠΈΠ»ΠΈ <диск>: \ (Π‘: \, D: \ ΠΈΡ… Π΄.).

...

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅

ВсС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ Π΄Π°Π»Π΅Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ прСобразования Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΠΉΡ‚ΠΈ Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅ PathConvert, располоТСнном Π½Π° дискС, Π² ΠΏΠ°ΠΏΠΊΠ΅ с Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ ΠΏΠΎΠ΄Ρ€Π°Π·Π΄Π΅Π»Π°.

ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Π»ΠΈΠ½Π½Ρ‹Ρ… ΠΈΠΌΠ΅Π½ Ρ„Π°ΠΉΠ»ΠΎΠ² Π² ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠ΅ ΠΈ Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚

Π’Π΅ΠΏΠ΅Ρ€ΡŒ рассмотрим Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ прСобразования ΠΏΡƒΡ‚Π΅ΠΉ. Π‘Π½Π°Ρ‡Π°Π»Π° – ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ Π΄Π»ΠΈΠ½Π½ΠΎΠΉ ΠΈ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎΠΉ Ρ„ΠΎΡ€ΠΌΠ°ΠΌΠΈ. ВыполняСтся это ΠΏΡ€Π΅Π΄Π΅Π»ΡŒΠ½ΠΎ просто, Π±Π»Π°Π³ΠΎ Windows API прСдусматриваСт ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Π»ΠΈΠ½Π½ΠΎΠ³ΠΎ ΠΏΡƒΡ‚ΠΈ Π² ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠΉ приводится Π² листингС 4.17.

...

Листинг 4.17.

ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡƒΡ‚ΠΈ ΠΈΠ· Π΄Π»ΠΈΠ½Π½ΠΎΠΉ Π² ΠΊΠΎΡ€ΠΎΡ‚ΠΊΡƒΡŽ Ρ„ΠΎΡ€ΠΌΡƒ

function LongPathToShort(path: String): String;

var

buffer: String;

len: Integer;

begin

SetLength(buffer, MAX_PATH);

len := GetShortPathName(PAnsiChar(path), PAnsiChar(buffer),

MAX_PATH);

SetLength(buffer, len);

LongPathToShort := buffer;

end;

БоотвСтствСнно, ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ΅ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡƒΡ‚ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ (листинг 4.18).

...

Листинг 4.18.

ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡƒΡ‚ΠΈ ΠΈΠ· ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎΠΉ Π² Π΄Π»ΠΈΠ½Π½ΡƒΡŽ Ρ„ΠΎΡ€ΠΌΡƒ

function ShortPathToLong(path: String): String;

var

buffer: String;

len: Integer;

begin

SetLength(buffer, MAX_PATH);

len := GetLongPathName(PAnsiChar(path), PAnsiChar(buffer),

MAX_PATH);

SetLength(buffer, len);

ShortPathToLong := buffer;

end;

ΠŸΡ€ΠΈ тСстировании послСднСго листинга Π² Delphi 7 Π²Ρ‹ΡΡΠ½ΠΈΠ»ΠΎΡΡŒ, Ρ‡Ρ‚ΠΎ API-функция GetLongPathName объявлСна Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅ Windows. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π² Π±ΠΎΠ»Π΅Π΅ старых ΠΈΠ»ΠΈ Π½ΠΎΠ²Ρ‹Ρ… вСрсиях Delphi это Π½Π΅ Ρ‚Π°ΠΊ. Но Π² любом случаС ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ эту Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈΠ· Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Kernel32. dll ΠΏΡ€Π΅Π΄Π΅Π»ΡŒΠ½ΠΎ просто, достаточно ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π² ΠΌΠΎΠ΄ΡƒΠ»ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ строку:

...

function GetLongPathName(lpszLongPath: PChar;

lpszShortPath: PChar; cchBuffer: DWORD): DWORD;

stdcall; external kernel32 name \'GetLongPathNameA\

ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎΠ³ΠΎ ΠΏΡƒΡ‚ΠΈ Π² ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΈ Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡ€ΠΈΡˆΠ»Π° ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΉ ΠΌΠ΅ΠΆΠ΄Ρƒ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎΠΉ ΠΈ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΠ°ΠΌΠΈ ΠΏΡƒΡ‚Π΅ΠΉ. Однако сначала рассмотрим Π½Π΅Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ, Π½ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΡƒΡŽ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡƒΡŽ ΠΏΡ€ΠΈ прСобразованиях. ΠŸΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° GetPathElements (листинг 4.19) Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅Ρ‚ список строк ΠΈΠ· ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π΅ΠΉ ΠΏΡƒΡ‚ΠΈ (ΠΈΠΌΠ΅Π½ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ² ΠΈ ΠΈΠΌΠ΅Π½ΠΈ Ρ†Π΅Π»Π΅Π²ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° ΠΈΠ»ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°).

...

Листинг 4.19.

Π Π°Π·Π±ΠΈΠ΅Π½ΠΈΠ΅ ΠΏΡƒΡ‚ΠΈ Π½Π° ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅

procedure GetPathElements(path: String; elements: TStrings);

var

start, pos: Integer;

begin

start := 1;

for pos := 1 to Length(path) do

if path[pos] = \'\\' then

begin

if start <> pos then

//Π’Ρ‹Π΄Π΅Π»ΠΈΠΌ имя ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°

elements.Add(Copy(path, start, pos – start))

else

//Π‘ΠΎΡ‡Π΅Ρ‚Π°Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° \'\\\' Π² ΡΠ΅Ρ€Π΅Π΄ΠΈΠ½Π΅ ΠΏΡƒΡ‚ΠΈ пропускаСм

;

start := pos + 1;

end;

pos := Length(path) + 1;

if start <> pos then

//Π’Ρ‹Π΄Π΅Π»ΠΈΠΌ имя послСднСго ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° ΠΈΠ»ΠΈ Ρ„Π°ΠΉΠ»Π°

elements.Add(Copy(path, start, pos – start));

end;

ПослС примСнСния ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ GetPathElements Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌΠΈ ΠΏΡƒΡ‚ΠΈ становится ΠΎΡ‡Π΅Π½ΡŒ ΡƒΠ΄ΠΎΠ±Π½ΠΎ, Π΄Π° ΠΊ Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ ΠΈ упрощаСтся ΠΊΠΎΠ΄ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ прСобразования, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΏΡ€ΠΈ ΠΈΡ… написании Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΡƒΠ΄Π΅Π»ΡΡ‚ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΌΡƒ Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΡŽ подстрок ΠΈΠ· строки ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ ΠΏΡƒΡ‚ΠΈ.

Ѐункция прСобразования Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎΠ³ΠΎ ΠΏΡƒΡ‚ΠΈ Π² ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ (ΠΎΡ‚ Π·Π°Π΄Π°Π½Π½ΠΎΠΉ Π² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π΅ curdir ΠΏΠ°ΠΏΠΊΠΈ) приводится Π² листингС 4.20.

...

Листинг 4.20.

ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎΠ³ΠΎ ΠΏΡƒΡ‚ΠΈ Π² ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ

function AbsPathToRelative(path, curdir: String): String;

var

pathElements, curElements: TStrings;

outPath: String;

i, j: Integer;

begin

if Copy(path, 1, 2) <> Copy(curdir, 1, 2) then

begin

//Папки Π½Π° Ρ€Π°Π·Π½Ρ‹Ρ… дисках

AbsPathToRelative := path;

Exit;

end;

//ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎΠ³ΠΎ ΠΈ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΏΡƒΡ‚ΠΈ

pathElements := TStringList.Create;

GetPathElements(path, pathElements);

curElements := TStringList.Create;

GetPathElements(curdir, curElements);

//ΠŸΡ€ΠΎΠΏΡƒΡΠΊΠ°Π΅ΠΌ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Π΅ ΠΏΠ°ΠΏΠΊΠΈ

i := 0;

while (i < curElements.Count) and (i < pathElements.Count)

and (CompareText(curElements[i], pathElements[i]) = 0) do Inc(i);

//ДобавляСм Π½Π΅Π±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ΅ количСство ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΎΠ² Π²Π²Π΅Ρ€Ρ… для Ρ‚ΠΎΠ³ΠΎ,

//Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ· ΠΏΠ°ΠΏΠΊΠΈ curdir ΠΏΠΎΠΏΠ°ΡΡ‚ΡŒ Π² ΠΎΠ±Ρ‰ΡƒΡŽ для path ΠΈ curdir ΠΏΠ°ΠΏΠΊΡƒ

for j := i to curElements.Count-1 do

outPath := outPath + \'..\\

//Π—Π°Ρ…ΠΎΠ΄ΠΈΠΌ ΠΈΠ· ΠΏΠ°ΠΏΠΊΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠΉ (ΠΎΠ±Ρ‰Π΅ΠΉ) ΠΏΠ°ΠΏΠΊΠΈ Π² ΠΏΠ°ΠΏΠΊΡƒ path

for j := i to pathElements.Count – 2 do

outPath := outPath + pathElements[j] + \'\\

//ПослСдним добавляСм имя ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΉ ΠΏΠ°ΠΏΠΊΠΈ ΠΈΠ»ΠΈ Ρ„Π°ΠΉΠ»Π°

AbsPathToRelative := outPath + pathElements[pathElements.Count – 1];

//Бписки строк большС Π½Π΅ Π½ΡƒΠΆΠ½Ρ‹

pathElements.Free;

curElements.Free;

end;

ΠŸΡ€ΠΈ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΈ Π½ΡƒΠΆΠ½ΠΎ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΡƒΡ‚ΠΈ, Π½Π΅ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‰ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΈ сСтСвой ΠΈΠ»ΠΈ ΠΏΡƒΡ‚ΠΈ, ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‰ΠΈΠ΅ Ρ€Π°Π·Π½Ρ‹ΠΌ дискам, Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ прСдставлСны ΠΎΠ΄ΠΈΠ½ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ: Ρƒ Π½ΠΈΡ… Π½Π΅Ρ‚ ΠΎΠ±Ρ‰Π΅Π³ΠΎ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°.

ΠžΠ±Ρ€Π°Ρ‚Π½ΠΎΠ΅ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΏΡƒΡ‚ΠΈ Π² Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΎ Π² листингС 4.21. Π—Π΄Π΅ΡΡŒ Π½ΡƒΠΆΠ½ΠΎ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ссли ΠΏΡƒΡ‚ΡŒ ΠΏΠ°ΠΏΠΊΠΈ curdir ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ, Ρ‚ΠΎ Π² ΠΈΡ‚ΠΎΠ³Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ (Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠ°ΠΏΠΊΠΈ). ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ функция ΠΈ называСтся RelativePathToRelative, Π° Π½Π΅ RelativePathToAbs.

...

Листинг 4.21.

ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΏΡƒΡ‚ΠΈ Π² Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½Ρ‹ΠΉ

function RelativePathToRelative(path, curdir: String): String;

var

pathElements, curElements: TStrings;

outPath: String;

i: Integer;

begin

//ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ списка ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎΠ³ΠΎ ΠΈ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΏΡƒΡ‚ΠΈ

pathElements := TStringList.Create;

GetPathElements(path, pathElements);

curElements := TStringList.Create;

GetPathElements(curdir, curElements);

//Π˜Π·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ находимся Π² послСднСй ΠΏΠ°ΠΏΠΊΠ΅ ΠΏΡƒΡ‚ΠΈ curdir

//"ΠŸΡƒΡ‚Π΅ΡˆΠ΅ΡΡ‚Π²ΡƒΠ΅ΠΌ" ΠΎΡ‚ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ ΠΏΠ°ΠΏΠΊΠΈ Π²Π²Π΅Ρ€Ρ… ΠΈΠ»ΠΈ Π²Π½ΠΈΠ·

//ΠΏΠΎ Π΄Π΅Ρ€Π΅Π²Ρƒ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ²

//(прибавляя ΠΈΠ»ΠΈ удаляя ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ ΠΏΡƒΡ‚ΠΈ Π² список curElements)

for i := 0 to pathElements.Count–1 do

begin

if pathElements[i] = \'..\' then

//Π’Π²Π΅Ρ€Ρ… ΠΏΠΎ Π΄Π΅Ρ€Π΅Π²Ρƒ

if (curElements.Count > 0)then

curElements.Delete(curElements.Count – 1)

else

curElements.Append(\'..\')

else if pathElements[i] <> \'.\' then

//Π’Π½ΠΈΠ· ΠΏΠΎ Π΄Π΅Ρ€Π΅Π²Ρƒ (Π·Π½Π°ΠΊ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ ΠΏΠ°ΠΏΠΊΠΈ "." Π½Π΅ измСняСт

//ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅)

curElements.Append(pathElements[i]);

end;

//Π€ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡƒΡ‚ΡŒ

if (curElements.Count > 0) then outPath := curElements[0];

for i := 1 to curElements.Count-1 do

outPath := outPath + \'\\' + curElements[i];

RelativePathToRelative := outPath;

//Бписки строк большС Π½Π΅ Π½ΡƒΠΆΠ½Ρ‹

pathElements.Free;

curElements.Free;

end;

Поиск

Поиск являСтся Π½Π΅ΠΎΡ‚ΡŠΠ΅ΠΌΠ»Π΅ΠΌΠΎΠΉ Ρ‡Π°ΡΡ‚ΡŒΡŽ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмой. Π”Π°ΠΆΠ΅ простой просмотр содСрТимого любого ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° сопряТСн с использованиСм ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΡ…, Π½ΠΎ всС-Ρ‚Π°ΠΊΠΈ поисковых срСдств (ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€ ΠΈ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, отсСиваниС элСмСнтов ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°). ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π΄Π°Π»Π΅Π΅ ΠΌΡ‹ рассмотрим Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π΄Π²ΡƒΡ… ΡƒΠ΄ΠΎΠ±Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ поиска: поиск ΠΏΠΎ маскС ΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌ Ρ„Π°ΠΉΠ»ΠΎΠ² Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… Π·Π°Π΄Π°Π½Π½ΠΎΠΉ ΠΏΠ°ΠΏΠΊΠΈ ΠΈ Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅ поиск ΠΏΠΎ всСму Π΄Π΅Ρ€Π΅Π²Ρƒ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ², начиная ΠΎΡ‚ Π·Π°Π΄Π°Π½Π½ΠΎΠΉ ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΉ ΠΏΠ°ΠΏΠΊΠΈ. ВсС рассмотрСнныС Π΄Π°Π»Π΅Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ поиска ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅ Search, располоТСнном Π½Π° дискС, Π² ΠΏΠ°ΠΏΠΊΠ΅ с Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ ΠΏΠΎΠ΄Ρ€Π°Π·Π΄Π΅Π»Π°.

Но сначала Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ свСдСний ΠΎ масках для поиска ΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² (ΠΈ ΠΏΠ°ΠΏΠΎΠΊ).

Маски ΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹

Маска ΠΈΠΌΠ΅Π½ΠΈ Ρ„Π°ΠΉΠ»Π° ΠΈΠ»ΠΈ ΠΏΠ°ΠΏΠΊΠΈ прСдставляСт собой строку, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ нСизвСстный ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½Ρ‹ΠΉ символ ΠΌΠΎΠΆΠ½ΠΎ ΠΌΠ΅Π½ΡΡ‚ΡŒ Π½Π°? Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠ΅ количСство (0 ΠΈ Π±ΠΎΠ»Π΅Π΅) нСизвСстных Π·Π°Ρ€Π°Π½Π΅Π΅ символов – Π½Π° *. ΠžΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ (допустимыС Π² ΠΈΠΌΠ΅Π½ΠΈ) символы ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‚ сами сСбя. НапримСр, ΠΈΠΌΠ΅Π½Π° Ρ„Π°ΠΉΠ»ΠΎΠ² SomeFile. Π΅Ρ…Π΅ ΠΈ Some. Π΅Ρ…Π΅ ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€ΡΡŽΡ‚ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΠ· масок: Some* ΠΈ Some*. Π΅Ρ…Π΅.

Атрибуты ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Π°ΠΆΠ½Ρ‹Π΅ особСнности Ρ„Π°ΠΉΠ»Π°. Π’Π°ΠΊ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡ€ΠΈ просмотрС ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ API-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΏΠ°ΠΏΠΊΠ° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ‚Π»ΠΈΡ‡Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ Ρ„Π°ΠΉΠ»Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ΠΌ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° FILE_ATTRIBURE_DIRECTORY. Π’ΠΎΠΎΠ±Ρ‰Π΅ содСрТимоС ΠΏΠ°ΠΏΠΊΠΈ (Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ, ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°) записано Π½Π° дискС Π² самый ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ». Π•Π³ΠΎ ΠΎΡ‚Π»ΠΈΡ‡Π°Π΅Ρ‚ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ нСизмСняСмого Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° ΠΈ строго Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ записСй, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΡΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰ΠΈΡ… ΠΎΡ‚ нас всС особСнности Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° (ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π°, поиск Π½ΡƒΠΆΠ½Ρ‹Ρ… записСй).

Π˜Ρ‚Π°ΠΊ, Π΄Π°Π»Π΅Π΅ ΠΎΠ± Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°Ρ…. НиТС приводится ΠΏΠ΅Ρ€Π΅Ρ‡Π΅Π½ΡŒ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ² (ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ цСлочислСнных констант, ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹Ρ… Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅ Windows). Если Π½Π΅ сказано ΠΈΠ½ΠΎΠ΅, Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ.

β€’ FILE_ATTRIBUTE_ARCHIVE – Π°Ρ€Ρ…ΠΈΠ²Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» ΠΈΠ»ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ (Π½Π° ΠΎΠΏΡ‹Ρ‚Π΅ Π·Π°ΠΌΠ΅Ρ‡Π΅Π½ΠΎ, Ρ‡Ρ‚ΠΎ этот Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ появляСтся практичСски Ρƒ всСх Ρ„Π°ΠΉΠ»ΠΎΠ², находящихся Π½Π° дискС Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ врСмя);

β€’ FILE_ATTRIBUTE_DIRECTORY – Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° (Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ нСльзя ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡΠ½ΡΡ‚ΡŒ ΠΈΠ»ΠΈ Π½Π°Π·Π½Π°Ρ‡ΠΈΡ‚ΡŒ);

β€’ FILE_ATTRIBUTE_HIDDEN – скрытый Ρ„Π°ΠΉΠ» ΠΈΠ»ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³;

β€’ FILE_ATTRIBUTE_NORMAL – ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ отсутствиС особых Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² Ρƒ Ρ„Π°ΠΉΠ»Π° ΠΈΠ»ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° (Ρƒ послСднСго, СстСствСнно, всСгда установлСн Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ FILE_ ATTRIBUTE_DIRECTORY);

β€’ FILE_ATTRIBUTE_READONLY – Ρ„Π°ΠΉΠ» ΠΈΠ»ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для чтСния;

β€’ FILE_ATTRIBUTE_SYSTEM – систСмный Ρ„Π°ΠΉΠ» ΠΈΠ»ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³;

β€’ FILE_ATTRIBUTE_TEMPORARY – Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» (файловая систСма стрСмится ΠΏΠΎ возмоТности Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ всС содСрТимоС ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° Π² памяти для ускорСния доступа ΠΊ находящимся Π² Π½Π΅ΠΌ Π΄Π°Π½Π½Ρ‹ΠΌ).

Π‘Ρ‹Π»ΠΈ рассмотрСны основныС Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ присвоСны ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмы (Ρ„Π°ΠΉΠ»Π°ΠΌ ΠΈ ΠΏΠ°ΠΏΠΊΠ°ΠΌ), Π½ΠΎ Π½Π΅ Π±Ρ‹Π»ΠΎ сказано, ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈΠ»ΠΈ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ Ρ„Π°ΠΉΠ»Π° ΠΈΠ»ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°. Атрибуты ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈ просмотрС содСрТимого ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° (ΠΊΠ°ΠΊ Π² рассмотрСнных Π΄Π°Π»Π΅Π΅ функциях поиска). А ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для этого API-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ GetFileAttributes. Она ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΏΡƒΡ‚ΡŒ Ρ„Π°ΠΉΠ»Π° (PChar) ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° DWORD (32-Π±ΠΈΡ‚Π½ΠΎΠ΅ Ρ†Π΅Π»ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅), ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π΅Π΅ собой Π±ΠΈΡ‚ΠΎΠ²ΡƒΡŽ маску. Если функция GetFileAttributes Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ Π½Π΅ΡƒΠ΄Π°Ρ‡Π½ΠΎ, Ρ‚ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ€Π°Π²Π½ΠΎ $FFFFFFFF (-1 ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π΅ ΠΊ Π±Π΅Π·Π·Π½Π°ΠΊΠΎΠ²ΠΎΠΌΡƒ Ρ†Π΅Π»ΠΎΠΌΡƒ).