【问题标题】:Delphi download files in a directoryDelphi 下载目录中的文件
【发布时间】:2015-07-13 03:26:07
【问题描述】:

我找到了一些解决方案,但它们过于复杂或根本不起作用。我必须从服务器下载 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 传递一个包含所有链接和必须下载的文件名的列表。

【问题讨论】:

  • 如果您想要文件中的内容,为什么要使用内存流?使用文件流。如果您有多个文件,请使用循环。
  • 对文件流使用循环?
  • 没有。循环下载每个文件的列表。而不是对 DownloadFile 进行不同的调用。
  • 没有。只需对文件名运行一个循环,然后在循环体中调用 DownloadFile。
  • 创建一个过程DownloadFiles并使用2个参数:URLS: TStrings和SavePath: string。现在循环TStrings(例如你传递TStringList),调用DownloadFile(URLS[i]...)并在每次迭代中更新进度条。 P.S:一般IdHTTP 是阻塞的,所以如果您在主 UI 线程中使用它,您将体验到非响应式 UI - 最好在单个线程中进行每次下载。有很多例子......

标签: delphi indy idhttp


【解决方案1】:

您可以使用 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;

【讨论】:

  • 字典似乎是个糟糕的选择。一个数组是有意义的。您的 for 循环语法严重损坏。
  • @DavidHeffernan 请解释为什么字典是不好的选择。
  • 因为数组更高效更简单
猜你喜欢
  • 2013-07-23
  • 2015-12-16
  • 2011-03-31
  • 1970-01-01
  • 1970-01-01
  • 2016-05-28
  • 1970-01-01
  • 2012-11-02
相关资源
最近更新 更多