【问题标题】:Delphi Upload file to FTP [duplicate]Delphi将文件上传到FTP [重复]
【发布时间】:2015-12-27 22:34:43
【问题描述】:

我刚刚创建了这个小应用程序,它将 2 个字符串转储到 txt 文件中。现在我希望将该 txt 文件上传到 ftp。我看过一些教程,但找不到任何关于如何做到这一点的好教程。请帮我。我将发布我的文件代码。

   var

  fText:textfile;
  sText:string;
  s1Text:string;
begin
assignfile(fText,'d:\test.txt') ;

if fileExists('d:\test.txt') <>true then
begin

  rewrite(fText);
  end

  else
  begin
  Append(fText)
  end;


  sText:=Edit1.Text;
  s1Text:=Edit2.Text;
  writeln(fText,sText) ;
  writeln(fText,s1Text);
  closefile(fText);
end;

【问题讨论】:

    标签: delphi text ftp


    【解决方案1】:

    一种方法是通过在 Delphi 代码中使用 CreateProcess 调用的 Windows FTP 命令。为了方便扩展上传更多文件的功能,我使用了一个上传脚本,它告诉 Windows FTP 命令该做什么。 (类似的功能也适用于下载文件:首先将put 更改为get

    function TForm1.Upload: Boolean;
    var
      Script: TStringList;
      Command: String;
    begin
    
        Script := TStringList.Create;
        try
          Script.Text := 'User Username' + #13#10 +
          'Password' + #13#10 +
          'cd /temp' + #13#10 + // ftp folder (destination)
          'put d:\test.txt' + #13#10 + // local folder (source)
          'bye';
          Script.SaveToFile('d:\test\myuploadscript.txt');
    
          Command := 'FTP -v -i -n -s:"d:\test\myuploadscript.txt" ftp://mytestftpsite'
    
          Result := ExecNewProcess(Command, True);
    
       finally
         Script.Free;
       end;
    
    end;
    
    function TForm1.ExecNewProcess(ProgramName: String; AShowMsg: Boolean): Longword;
    var
      StartInfo: TStartupInfo;
      ProcInfo: TProcessInformation;
      CreateOK: Boolean;
    begin
    
      FillChar(StartInfo,SizeOf(TStartupInfo),#0);
      FillChar(ProcInfo,SizeOf(TProcessInformation),#0);
      StartInfo.cb := SizeOf(TStartupInfo);
      if AShowMsg then
      begin
        StartInfo.dwFlags := STARTF_USESHOWWINDOW;
        StartInfo.wShowWindow := SW_SHOW;
      end;
    
      CreateOK := CreateProcess(nil, @ProgramName[1], nil, nil, False,
                  NORMAL_PRIORITY_CLASS,
                  nil, nil, StartInfo, ProcInfo);
    
      if CreateOK then
      begin
        WaitForSingleObject(ProcInfo.hProcess, INFINITE);
        GetExitCodeProcess(ProcInfo.hProcess, Result);
      end;
    
      if ProcInfo.hProcess <> 0 then
        CloseHandle(ProcInfo.hProcess);
      if ProcInfo.hThread <> 0 then
        CloseHandle(ProcInfo.hThread);
    end;
    

    【讨论】:

    • 这是一个糟糕的答案。 Delphi 带有一套非常好的支持 FTP 的 Internet 组件 (Indy),还有其他可用的本地解决方案。生成一个命令行实用程序来做一些你可以在本地做的事情(用更少的代码行)是完全错误的。
    • 它仍然有效。
    • @Ken White 注意,在我的回答中,我说“一种方法”。我没有声称它是最短、最简单、最简单或最好的答案。然而,这是对这个问题的完整答案。因此,它不可能是“错误的”——它只是你碰巧不喜欢的一个!
    • 没说错。我说这是一个糟糕的答案。这就像被问到如何最好地移动 1000 块烟囱砖并回答 租一辆保时捷并移动 100 个负载,每个负载 10 块砖,而不是租一辆卡车
    • 我在您上面的第一条评论中看到“完全错误”这句话。然而,如果我选择使用保时捷一次移动 10 块积木,那我为什么不能呢?搬砖警察会不会罚我一巴掌!?
    猜你喜欢
    • 2016-04-01
    • 2017-04-30
    • 2013-08-25
    • 1970-01-01
    • 1970-01-01
    • 2018-07-27
    • 2012-07-06
    • 1970-01-01
    • 2012-03-12
    相关资源
    最近更新 更多