掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
TClientSocketのリファレンスは? (ID:1559)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
考え方が合っているかどうかはわかりませんが、FTPサーバからファイルを取得するプロシージャを作ってみました。 1000バイトごと読み込み、プロシージャに与えられたプロシージャを呼びながらファイルを読み込みます。 最初、ログインしてファイルのサイズを取得するため、最初のプログレスなどの処理が少し遅れます。 書き込みは作っていませんが、だいたい同じような方法でできます。 コールバック関数(InternetSetStatusCallback)は、接続・切断・要求発行、などの情報しか使えません。 ファイルのどこまで取得したかは、自分で管理する必要があるようです。 type TFTPProgProc = procedure (FileName: String; Pos, Max: ULARGE_INTEGER) of object; procedure GetFtpFile(ServerName, UserName, Password, FileName: String; Stream: TMemoryStream; ProgProc: TFTPProgProc); implementation procedure GetFtpFile(ServerName, UserName, Password, FileName: String; Stream: TMemoryStream; ProgProc: TFTPProgProc); const ReadSize = 1000; var hInternet: WinInet.HINTERNET; hFtpSession: WinInet.HINTERNET; hFind: WinInet.HINTERNET; hFile: WinInet.HINTERNET; fd: WIN32_FIND_DATA; Size, Position: ULARGE_INTEGER; bResult: BOOL; Buf: PChar; RSize: DWORD; begin hInternet := InternetOpen( 'Delphi Application', INTERNET_OPEN_TYPE_DIRECT, nil, nil, 0); hFtpSession := InternetConnect( hInternet, PChar(ServerName), INTERNET_DEFAULT_FTP_PORT, PChar(UserName), PChar(Password), INTERNET_SERVICE_FTP, 0, 0); hFind := FtpFindFirstFile(hFtpSession, PChar(FileName), fd, 0, 0); if hFind = nil then Exit; Size.LowPart := fd.nFileSizeLow; Size.HighPart := fd.nFileSizeHigh; Position.QuadPart := 0; InternetCloseHandle(hFind); hFile := FtpOpenFile( hFtpSession, PChar(FileName), GENERIC_READ, FTP_TRANSFER_TYPE_ASCII, 0); ProgProc(FileName, Position, Size); Buf := GetMemory(ReadSize); while true do begin bResult := InternetReadFile( hFile, Buf, ReadSize, RSize); if(bResult And (RSize = 0)) then break; Stream.WriteBuffer(buf[0], RSize); Position.QuadPart := Position.QuadPart + RSize; ProgProc(FileName, Position, Size); end; ProgProc(FileName, Size, Size); InternetCloseHandle(hFile); InternetCloseHandle(hFtpSession); InternetCloseHandle(hInternet); end;
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.