Indy 从列表框中下载选定的文件

Indy download selected file from the listbox

我从未使用过 Indy,正在努力学习基础知识。我花了一些时间弄清楚如何填充列表框。现在我已经完成了,我怎样才能在列表框中下载选定的文件? 我试过了:

procedure TFTP.Button2Click(Sender: TObject);
var
i:integer;
begin
for i := 0 to ListBox1.Items.Count - 1 do begin
if ListBox1.Selected[i] then begin
IdFTP1.Get(listbox1.Selected[i]);
end;
end;
end;

但我得到了:

[dcc32 Error] FTP_Form.pas(75): E2250 There is no overloaded version of 'Get' that can be called with these arguments

或者我是否也需要使用保存对话框?请帮我解决一下这个。 :)

ListBox1.Selected[i] 是一个 Boolean。请注意,您在上一行中写道:

if ListBox1.Selected[i] then begin

现在,看看 TIdFTP.Get() 方法。它有两个重载:

procedure Get(const ASourceFile: string; ADest: TStream; 
  AResume: Boolean = false); overload;
procedure Get(const ASourceFile, ADestFile: string; const ACanOverwrite: boolean = false; 
  AResume: Boolean = false); overload;

您需要提供:

  • 您要下载的远程文件的源文件名。
  • 接收远程文件内容的目标文件名或流。

我不知道你打算从哪里得到这些。据推测,文件名来自 ListBox,因此应该是 ListBox1.Items[i].

您想对下载的内容做什么?留在记忆中?保存到文件?还有别的吗?您提供的目的地取决于您对这些问题的回答。

我对你的建议是暂时将 ListBox 放在一边,编写一个更简单的程序,一个没有任何 UI 的程序,它只是从 FTP 服务器下载一个文件.使用本地文件名或 TFileStream 将下载的内容保存到本地磁盘。检查内容是否符合您的预期。一旦可以下载一个文件,就可以将任意数量的文件下载到其他类型的目的地。

一旦你掌握了它,就可以继续使用用户界面了。花一些时间了解 ListBox 控件的工作原理、如何填充它、如何从中读回字符串、如何测试选择等等。

只有当你对所涉及的所有部分都有很好的了解时,你才应该尝试将它们组合在一起。

一种方式....

procedure TFTP.Button2Click(Sender: TObject);
Var
Name{, Line}: String;
begin
Name := IdFTP1.DirectoryListing.Items[ListBox1.ItemIndex].FileName;
SaveDialog1.FileName := Name;
if SaveDialog1.Execute then begin
IdFTP1.Get(Name, SaveDialog1.FileName, true);
end;
end;

假设 ListBox 包含要下载的远程文件名(例如从 TIdFTP.DirectoryListing 属性 调用 TIdFTP.List() 后):

procedure TFTP.Button2Click(Sender: TObject);
var
  i:integer;
begin
  for i := 0 to ListBox1.Items.Count - 1 do
  begin
    if ListBox1.Selected[i] then begin
      IdFTP1.Get(ListBox1.Items[i], 'C:\Some Local Path\' + ListBox1.Items[i]);
    end;
  end;
end;