Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.10.02;
Скачать: CL | DM;

Вниз

Прогресс Download/Upload   Найти похожие ветки 

 
Frozen_Fish ©   (2005-06-07 14:14) [0]

День добрый! Пишу диплом FTPManager. Проблема в отоброжение процесса скачивания/закачивания файла с FTP сервера. Не подскаже те как это с делать? А если ещё и код подскажете, буду очень благодарен!
Заранее спасибо!


 
dmitry501 ©   (2005-06-08 04:49) [1]

{  
 The following function shows how to connect to a ftp server  
 and download a file.  
 It uses the functions from wininet.dll.  

 You need a ProgressBar to show the progress and a Label to show progress informations.  
}  

uses  
 WinInet, ComCtrls;  

function FtpDownloadFile(strHost, strUser, strPwd: string;  
 Port: Integer; ftpDir, ftpFile, TargetFile: string; ProgressBar: TProgressBar): Boolean;  

 function FmtFileSize(Size: Integer): string;  
 begin  
   if Size >= $F4240 then  
     Result := Format("%.2f", [Size / $F4240]) + " Mb"  
   else  
   if Size < 1000 then  
     Result := IntToStr(Size) + " bytes"  
   else  
     Result := Format("%.2f", [Size / 1000]) + " Kb";  
 end;  

const  
 READ_BUFFERSIZE = 4096;  // or 256, 512, ...  
var  
 hNet, hFTP, hFile: HINTERNET;  
 buffer: array[0..READ_BUFFERSIZE - 1] of Char;  
 bufsize, dwBytesRead, fileSize: DWORD;  
 sRec: TWin32FindData;  
 strStatus: string;  
 LocalFile: file;  
 bSuccess: Boolean;  
begin  
 Result := False;  

 { Open an internet session }  
 hNet := InternetOpen("Program_Name", // Agent  
                       INTERNET_OPEN_TYPE_PRECONFIG, // AccessType  
                       nil,  // ProxyName  
                       nil, // ProxyBypass  
                       0); // or INTERNET_FLAG_ASYNC / INTERNET_FLAG_OFFLINE  

 {  
   Agent contains the name of the application or  
   entity calling the Internet functions  
 }  

 { See if connection handle is valid }  
 if hNet = nil then  
 begin  
   ShowMessage("Unable to get access to WinInet.Dll");  
   Exit;  
 end;  

 { Connect to the FTP Server }  
 hFTP := InternetConnect(hNet, // Handle from InternetOpen  
                         PChar(strHost), // FTP server  
                         port, // (INTERNET_DEFAULT_FTP_PORT),  
                         PChar(StrUser), // username  
                         PChar(strPwd),  // password  
                         INTERNET_SERVICE_FTP, // FTP, HTTP, or Gopher?  
                         0, // flag: 0 or INTERNET_FLAG_PASSIVE  
                         0);// User defined number for callback  

 if hFTP = nil then  
 begin  
   InternetCloseHandle(hNet);  
   ShowMessage(Format("Host "%s" is not available",[strHost]));  
   Exit;  
 end;  

 { Change directory }  
 bSuccess := FtpSetCurrentDirectory(hFTP, PChar(ftpDir));  

 if not bSuccess then  
 begin  
   InternetCloseHandle(hFTP);  
   InternetCloseHandle(hNet);  
   ShowMessage(Format("Cannot set directory to %s.",[ftpDir]));  
   Exit;  
 end;  

 { Read size of file }  
 if FtpFindFirstFile(hFTP, PChar(ftpFile), sRec, 0, 0) <> nil then  
 begin  
   fileSize := sRec.nFileSizeLow;  
   // fileLastWritetime := sRec.lastWriteTime  
 end else  
 begin  
   InternetCloseHandle(hFTP);  
   InternetCloseHandle(hNet);  
   ShowMessage(Format("Cannot find file ",[ftpFile]));  
   Exit;  
 end;  

 { Open the file }  
 hFile := FtpOpenFile(hFTP, // Handle to the ftp session  
                      PChar(ftpFile), // filename  
                      GENERIC_READ, // dwAccess  
                      FTP_TRANSFER_TYPE_BINARY, // dwFlags  
                      0); // This is the context used for callbacks.  

 if hFile = nil then  
 begin  
   InternetCloseHandle(hFTP);  
   InternetCloseHandle(hNet);  
   Exit;  
 end;  

 { Create a new local file }  
 AssignFile(LocalFile, TargetFile);  
 {$i-}  
 Rewrite(LocalFile, 1);  
 {$i+}  

 if IOResult <> 0 then  
 begin  
   InternetCloseHandle(hFile);  
   InternetCloseHandle(hFTP);  
   InternetCloseHandle(hNet);  
   Exit;  
 end;  

 dwBytesRead := 0;  
 bufsize := READ_BUFFERSIZE;  

 while (bufsize > 0) do  
 begin  
   Application.ProcessMessages;  

   if not InternetReadFile(hFile,  
                           @buffer, // address of a buffer that receives the data  
                           READ_BUFFERSIZE, // number of bytes to read from the file  
                           bufsize) then Break; // receives the actual number of bytes read  

   if (bufsize > 0) and (bufsize <= READ_BUFFERSIZE) then  
     BlockWrite(LocalFile, buffer, bufsize);  
   dwBytesRead := dwBytesRead + bufsize;  

   { Show Progress }  
   ProgressBar.Position := Round(dwBytesRead * 100 / fileSize);  
   Form1.Label1.Caption := Format("%s of %s / %d %%",[FmtFileSize(dwBytesRead),FmtFileSize(fileSize) ,ProgressBar.Position]);  
 end;  

 CloseFile(LocalFile);  

 InternetCloseHandle(hFile);  
 InternetCloseHandle(hFTP);  
 InternetCloseHandle(hNet);  
 Result := True;  
end;  


Взято с сайта http://www.swissdelphicenter.ch/en/tipsindex.php


 
Frozen_Fish ©   (2005-06-08 13:14) [2]

Мне нужен был только ProgressBar, но всё равно спасибо!
Разберёмся...



Страницы: 1 вся ветка

Текущий архив: 2005.10.02;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.05 c
14-1126283034
Santrope
2005-09-09 20:23
2005.10.02
Где можно прочитать про кртриджи?


1-1126466360
Stepan
2005-09-11 23:19
2005.10.02
Создание редактора


2-1124266220
Dimon777
2005-08-17 12:10
2005.10.02
Технологии доступа к данным


11-1097564571
Владимир Кладов
2004-10-12 11:02
2005.10.02
Версия 1.97


14-1125912858
badevlad
2005-09-05 13:34
2005.10.02
Участие в проекте