Π ΠΈΡ. 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 ΠΏΡΠΈ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄Π΅ ΠΊ Π±Π΅Π·Π·Π½Π°ΠΊΠΎΠ²ΠΎΠΌΡ ΡΠ΅Π»ΠΎΠΌΡ).