フォーラム


ゲスト  

ようこそ ゲスト さん。このフォーラムに投稿するには 登録が必要です。

ページ: [1]
トピック: Indy FTP によるダウンロードでレジューム機能を使う
Mr.XRAY
メンバー
投稿数: 192
Indy FTP によるダウンロードでレジューム機能を使う
on: 2013/04/24 20:33 Wed

ダウンロードにおけるレジューム機能とは,途中でダウンロードを中断した時に,
次回,残りの分を,同じファイルに追加してダウンロードすることです.
あまり使う機会はないとは思いますが,テストしてみました.

テストには,私のサイトのサンプルの [773] [03_FTP サーバからダウンロード ( TIdThreadComponent 使用 )]
を使用しました.そのサンプルの以下のイベントのコード部分だけ変更してテストしています.
http://mrxray.on.coocan.jp/Delphi/plSamples/773_Indy_FTPGetPut.htm#03

最初のダウンロードで,中断し,再度ダウンロードしています.
残りの分だけダウンロードしているので,プログレスバーが途中で止まっています.
必要であれば,適当に修正してください.
説明は省略します.これも必要であれば訊いてください.
動作確認環境は,Windows 7 U64(SP1) + Delphi XE Pro です.

//=============================================================================
// SourcFile : ダウンロードするサーバ上のファイル名
// DestFile : ダウンロード後のファイル名
// TFileの使用には,usesにIOUtilsが必要
//=============================================================================
procedure TForm1.IdThreadComponent1Run(Sender: TIdThreadComponent);
var
DestFile : String;
begin
DestFile := ExtractFilePath(Application.ExeName) + 'XXXXX';

try
try
if TFile.Exists(DestFile) then begin
IdFTP1.Get(SourceFile, DestFile, False, True);
end else begin
IdFTP1.Get(SourceFile, DestFile);
end;
Panel2.Caption := 'ダウンロード終了';
except
Panel2.Caption := 'ダウンロード中止';
end;
finally
//Terminateしてから次の作業をしないとファイルの中身消滅
IdThreadComponent1.Terminate;
if IdFTP1.Connected then begin
IdFTP1.Abort;
IdFTP1.Disconnect;
end;
Screen.Cursor := crDefault;
end;
end;

   

TMemoryStream を使用する場合は,例えば次のようになるかも知れません.

procedure TForm1.IdThreadComponent1Run(Sender: TIdThreadComponent);
var
DestFile : String;
AStream : TMemoryStream;
begin
DestFile := ExtractFilePath(Application.ExeName) + 'XXXXXX';

AStream := TMemoryStream.Create;
if TFile.Exists(DestFile) then begin
AStream.LoadFromFile(DestFile);
end;
AStream.Position := AStream.Size;

try
try
IdFTP1.Get(SourceFile, AStream, True);
Panel2.Caption := 'ダウンロード終了';
except
Panel2.Caption := 'ダウンロード中止';
end;
finally
AStream.SaveToFile(DestFile);
//Terminateしてから次の作業をしないとファイルの中身消滅
IdThreadComponent1.Terminate;
if IdFTP1.Connected then begin
IdFTP1.Abort;
IdFTP1.Disconnect;
end;
FreeAndNil(AStream);
Screen.Cursor := crDefault;
end;
end;

  

Mr.XRAY
メンバー
投稿数: 192
Re: Indy FTP によるダウンロードでレジューム機能を使う
on: 2013/04/24 21:35 Wed

ダウンロードファイルの有無をフラグにすると,スッキリしたコードになりますね.

procedure TForm1.IdThreadComponent1Run(Sender: TIdThreadComponent);
var
DestFile : String;
IsResume : Boolean;
begin
DestFile := ExtractFilePath(Application.ExeName) + 'XXXXXX';

try
try
IsResume := TFile.Exists(DestFile);
// ファイルの内容が前回と違っている可能性も考えて
// 必要ならば,上書き保存か,追加ダウンロードかの確認ダイアログ等を表示する
// その必要がなければ,ファイルの存在確認は不要(第3, 4 引数は,False, True でよい)
IdFTP1.Get(SourceFile, DestFile, not IsResume, IsResume);
Panel2.Caption := 'ダウンロード終了';
except
Panel2.Caption := 'ダウンロード中止';
end;
finally
//Terminateしてから次の作業をしないとファイルの中身消滅
IdThreadComponent1.Terminate;
if IdFTP1.Connected then begin
IdFTP1.Abort;
IdFTP1.Disconnect;
end;
Screen.Cursor := crDefault;
end;
end;

  

ページ: [1]
WP Forum Server by ForumPress | LucidCrew
バージョン: 1.7.5 ; ページロード: 0.022 sec.