Delphi.
Функция округления числа до нужного количества знаков:
Код:
function RoundFloat(R: Extended; Decimals: Integer): Extended;
var
Factor: Extended;
begin
Factor := Int(Exp(Decimals * Ln(10)));
Result := Round(Factor * R) / Factor;
end;
Используя вышеописанную функцию, получаем окгугленный размер файла в килобайтах (наиболее универсальная величина для большинства файлов):
Код:
Function FileSizeInKb(YourFile : String) : string;
Var
arg: extended;
F : Integer;
Begin
F:=FileOpen(YourFile,0);
arg := FileSeek(F,0,2);
FileClose(F);
arg:=roundfloat(arg/1024,1);
result:=floattostr(arg);
End;
Функция проверяет, открыт ли порт на хосте, с указанием времени ожидания ответа. Отличная вещь для написания сканера одного порта на диапазоне адресов. Зависимость - winsock2, обертку под делфню можно найти хде угодно
Код:
function PingPort(host: string; portnum: word; tim: integer): boolean;
var
k: integer;
s, opt: Integer;
FSocket: TSOCKET;
busy : boolean;
addr : TSockAddr;
hEvent : THandle;
fset : TFDset;
tv : TTimeval;
tec :PServEnt;
PName:String;
GInitData : TWSADATA;
begin
result := false;
WSAStartup(MAKEWORD(2,0), GInitData);
addr.sin_family := AF_INET;
addr.sin_addr.s_addr := INADDR_ANY;
addr.sin_port := htons(portnum);
hEvent := WSACreateEvent();
busy:=false;
FSocket := socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
WSAEventSelect(FSocket, hEvent, FD_WRITE + FD_CONNECT);
addr.sin_addr := LookupName(host);
connect(FSocket, @addr, sizeof(addr));
if WSAGetLastError()=WSAEINPROGRESS then
begin
closesocket (FSocket);
busy:=true;
end;
FD_Zero(fset);
if busy <> true then
FD_SET (FSocket, fset);
tv.tv_sec := tim;
tv.tv_usec := 0;
s:=select (1, nil, @fset, nil, @tv);
if busy then
exit;
if FD_ISSET (FSocket, fset) then
begin
s:=Sizeof(Opt);
opt:=1;
getsockopt(FSocket, SOL_SOCKET, SO_ERROR, @opt, s);
if opt=0 then
result := true;
closesocket(FSocket);
end;
WSACloseEvent(hEvent);
WSACleanup;
end;
Шустрый метод копирования файлов. При правильной подборке размера буфера можно добиться космической скорости
Код:
procedure CopyFile(file1,file2: string);
var
FromF, ToF: file;
NumRead, NumWritten: Integer;
Buf: array[1..2048] of Char;
begin
AssignFile(FromF, file1);
Reset(FromF, 1);
AssignFile(ToF, File2);
Rewrite(ToF, 1);
repeat
BlockRead(FromF, Buf, SizeOf(Buf), NumRead);
BlockWrite(ToF, Buf, NumRead, NumWritten);
until
(NumRead = 0) or (NumWritten <> NumRead);
CloseFile(FromF);
CloseFile(ToF);
end;