【问题标题】:Delphi - Resume file upload using TMagFtp componentDelphi - 使用 TMagFtp 组件恢复文件上传
【发布时间】:2016-04-04 12:07:01
【问题描述】:

我正在使用 TMagFtp 组件,该组件是使用 OveByte 的 ICS 组件集作为其基础构建的,用于将文件上传到 FTP 服务器。

这是我正在使用的代码:

Replace := FCReplDiff;

taskres := MagFTPClient.FtpLogon;
if taskres = TaskResOKNew then
begin
    for I := 1 to lstFiles.Count - 1 do
    begin
        UploadFileName := lstFiles.Items[I];
        UploadFileName := ExtractFileName(UploadFileName);
        taskres := MagFTPClient.FtpUpOneFile(ProjectFolderPath + UploadFileName, '/jobs/' + ProjectFolderName, ExtractFileName(UploadFileName), Replace);
        if (taskres = TaskResFail) then
        begin
            ShowMessage('Upload Failed' + #13 + GetTaskResName(taskres) + #13 + GetExceptMess(ExceptObject));
            UploadFailed := True;
            Exit;
        end;
    end;

end;

上传文件后,我重复上传过程,它会重新上传文件。实际上它应该跳过文件。有问题的 FTP 服务器支持 Resume。我用 Filezilla 进行了检查。

我不明白为什么?

【问题讨论】:

  • FCReplDiff 到底是什么意思?
  • 这个参数告诉 MagFTP 只上传与目标文件大小不同的文件
  • 另一个我观察到在 Windows 8 上上传一直失败。为什么?
  • 我在回答中添加了一些调试说明,相信我已经回答了您的问题。关于 Windows 8 上的故障将是另一个问题,因为它与这个无关。

标签: delphi ftp


【解决方案1】:

Replopt参数
TMagFtp.FtpUpOneFile(const LocFileFull, RemTarDir, RemTarFile: string; Replopt: TFileCopyRepl): TTaskResult;

具有以下值:

TFileCopyRepl = (FCReplNever, FCReplAlways, FCReplDiff, FCReplNewer) ;

使用FCReplNever 可能永远不会替换现有文件。


编辑。

查看源代码,FCReplDiff 似乎意味着如果文件大小不同或其时间戳与默认值为 2 秒的AllowDiffDT 不同,则可以替换该文件。可能是FTP服务器在不同的时区下运行,尤其是在不同国家的不同时间发生DST变化的时候,服务器上的文件时间报告有不同的时间,即使它是上传的之前的第一次。


编辑 2

您问题中的信息无法评估上述关于时间差异的理论。因此,为了验证,在第 4507 行下一个断点

    flag := MagCheckReplace (replopt, true, OneSecond * 2, SrcFSize, RFSize,
                                                           SrcFileUDT, RFileUDT) ;

在 MagentaFtp.pas 中检查 SrcFileUDTRFileUDT 的值。还可以进入MagCheckReplace() 函数,看看为什么它允许替换。

【讨论】:

    猜你喜欢
    • 2011-09-11
    • 2011-11-06
    • 2019-01-14
    • 2011-10-14
    • 1970-01-01
    • 2019-05-18
    • 1970-01-01
    • 1970-01-01
    • 2018-12-02
    相关资源
    最近更新 更多