Я же и написал, что функции подтупливают, если файл занят, т.к. в теле ф-ии происходит попытка открытия файла.
В принципе я нашел решение как вообще не пользовать эти ф-ии, просто стало интересно, возможно ли как-то штатными методами проверить наличие файла так, чтобы небыло подтупливания.
З.Ы. У меня код ф-ии выглядит так (XE 10):
Код:
function FileExists(const FileName: string; FollowLink: Boolean = True): Boolean;
{$IFDEF MSWINDOWS}
function ExistsLockedOrShared(const Filename: string): Boolean;
var
FindData: TWin32FindData;
LHandle: THandle;
begin
{ Either the file is locked/share_exclusive or we got an access denied }
LHandle := FindFirstFile(PChar(Filename), FindData);
if LHandle <> INVALID_HANDLE_VALUE then
begin
Winapi.Windows.FindClose(LHandle);
Result := FindData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY = 0;
end
else
Result := False;
end;
var
Flags: Cardinal;
Handle: THandle;
LastError: Cardinal;
begin
Flags := GetFileAttributes(PChar(FileName));
if Flags <> INVALID_FILE_ATTRIBUTES then
begin
if faSymLink and Flags <> 0 then
begin
if not FollowLink then
Exit(True)
else
begin
if faDirectory and Flags <> 0 then
Exit(False)
else
begin
Handle := CreateFile(PChar(FileName), GENERIC_READ, FILE_SHARE_READ, nil,
OPEN_EXISTING, 0, 0);
if Handle <> INVALID_HANDLE_VALUE then
begin
CloseHandle(Handle);
Exit(True);
end;
LastError := GetLastError;
Exit(LastError = ERROR_SHARING_VIOLATION);
end;
end;
end;
Exit(faDirectory and Flags = 0);
end;
LastError := GetLastError;
Result := (LastError <> ERROR_FILE_NOT_FOUND) and
(LastError <> ERROR_PATH_NOT_FOUND) and
(LastError <> ERROR_INVALID_NAME) and ExistsLockedOrShared(Filename);
end;