我正在使用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检查了它。
我不明白为什么?
答案 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中并检查SrcFileUDT
和RFileUDT
的值。同时进入MagCheckReplace()
函数,看看为什么它允许替换。