02-02-2019, Saat: 23:15
Herkese merhabalar,
Konuyu hangi başlıkla açmam gerektiğini pek çözemedim desem yeridir. Fonksiyon veya prosedür oluştururken bazen kullanıcının girmesi gereken tanımlamalara ihtiyaç duyarız. Delphi'de bazı fonksiyonlarda bu tanımlama var ama kullanıcı girmediği zaman bunu sanırsam default bir değere atıyor. Peki bunu nasıl yapıyor?
Örneğin FileExists() boolean fonksiyonunda FollowLink tanımı istenmekte; fakat ben buraya bir tanım girmediğim zaman yine de derlemeye devam ediyor ve hata istemiyor.
Fonksiyonun kod yazılımına baktığımda:
Şeklinde bir sonuç ortaya çıkıyor. Aklıma takılan bu olay nasıl oluyor. Kodu okumakta sorun yaşıyorum. Hele ki kaynak kodlarını...
Teşekkürler
Konuyu hangi başlıkla açmam gerektiğini pek çözemedim desem yeridir. Fonksiyon veya prosedür oluştururken bazen kullanıcının girmesi gereken tanımlamalara ihtiyaç duyarız. Delphi'de bazı fonksiyonlarda bu tanımlama var ama kullanıcı girmediği zaman bunu sanırsam default bir değere atıyor. Peki bunu nasıl yapıyor?
Örneğin FileExists() boolean fonksiyonunda FollowLink tanımı istenmekte; fakat ben buraya bir tanım girmediğim zaman yine de derlemeye devam ediyor ve hata istemiyor.
Fonksiyonun kod yazılımına baktığımda:
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;
{$ENDIF MSWINDOWS}
{$IFDEF POSIX}
var
StatBuf: _stat;
M: TMarshaller;
begin
if lstat(M.AsAnsi(FileName, CP_UTF8).ToPointer, StatBuf) = 0 then
begin
if S_ISLNK(StatBuf.st_mode) then
begin
if not FollowLink then
Exit(True)
else
begin
if stat(M.AsAnsi(FileName, CP_UTF8).ToPointer, StatBuf) = 0 then
Exit(not S_ISDIR(StatBuf.st_mode));
Exit(False);
end;
end;
Exit(not S_ISDIR(StatBuf.st_mode));
end;
Result := False;
end;
{$ENDIF POSIX}
Şeklinde bir sonuç ortaya çıkıyor. Aklıma takılan bu olay nasıl oluyor. Kodu okumakta sorun yaşıyorum. Hele ki kaynak kodlarını...
Teşekkürler
