Delphi - 使用TMagFtp组件恢复文件上载

时间:2016-04-04 12:07:02

标签: delphi ftp

我正在使用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检查了它。

我不明白为什么?

1 个答案:

答案 0 :(得分:1)

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

采用以下值:

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

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

编辑。

查看源代码,似乎FCReplDiff表示如果文件大小不同或者时间戳的差异大于AllowDiffDT且默认值为2秒,则可以替换该文件。可能是FTP服务器在不同的时区下运行,特别是在不同国家的不同时间发生DST更改的这些时间,报告服务器上的文件时间有不同的时间,即使它已被上传第一次就在此之前。

编辑2

上述关于时间差异的理论无法通过您问题中的信息进行评估。因此,要验证,在4507行放置一个断点

    flag := MagCheckReplace (replopt, true, OneSecond * 2, SrcFSize, RFSize,
                                                           SrcFileUDT, RFileUDT) ;
在MagentaFtp.pas中

并检查SrcFileUDTRFileUDT的值。同时进入MagCheckReplace()函数,看看为什么它允许替换。