Delphi下载目录中的文件

时间:2015-07-12 13:54:12

标签: delphi indy idhttp

我找到了一些解决方案,但它们太复杂了,或者只是它们不起作用。我必须从服务器下载200张图片(小图片,每张图片大约15 kB)。我以为我可以使用IdHTTP:

procedure TForm2.DownloadFile(filename, path: string);
var Stream: TMemoryStream;
    Url: String;
begin

  Url := filename;
  Stream := TMemoryStream.Create;

  try
    IdHTTP1.Get(Url, Stream);
    Stream.SaveToFile(path);
  finally
    Stream.Free;
    IdHTTP1.Free;
  end;

end;

这是我猜的最常见的方式,它的工作原理非常好。顺便说一句,根据我上面所说的,我必须下载多个文件,解决方案是:

DownloadFile('www.website.com/folder/file1.png', 'C:\folder\file1.png');
DownloadFile('www.website.com/folder/file2.png', 'C:\folder\file2.png');
DownloadFile('www.website.com/folder/file3.png', 'C:\folder\file3.png');

等等。我还有进度条,表示下载的进度。

问题

有更有效的方法吗? 例如,传递给IdHTTP的列表包含所有链接和必须下载的文件名。

1 个答案:

答案 0 :(得分:3)

你可以使用像TDictionary这样的泛型:

function DownloadFiles(FilesInfo: TDictionary<string, string>): Boolean;
var
  FileNo: Integer;
  Stream: TFileStream;
begin
  for FileNo := Low to High do
  begin
    Stream := TFileStream.Create(FilesInfo.Values[FileNo], fmCreate);
    try
      IdHTTP1.Get(FilesInfo.Keys[FileNo], Stream);
    finally
      Stream.Free;
    end;
  end;
end;

使用:

var
  FilesInfo: TDictionary<string, string>;
begin
  FilesInfo := TDictionary<string, string>.Create();
  try
    FilesInfo.Add('www.website.com/folder/file1.png', 'C:\folder\file1.png');
    FilesInfo.Add('www.website.com/folder/file2.png', 'C:\folder\file2.png');
    FilesInfo.Add('www.website.com/folder/file3.png', 'C:\folder\file3.png');
    DownloadFiles(FilesInfo);
  finally
    FilesInfo.Free;
  end;
end;