2010-05-25 148 views

回答

1

1)如果你在控制发送;一旦你发送了实际的文件,ftp一个具有相同名称但不同.ext的控制空文件。测试这个控制文件和实际的文件会没事的。

2)作为额外的测试;检查文件使用时间并在处理之前再等待30秒,这可能有必要避免网络文件锁定的延迟。

代码示例讲解2)

const 
    LastWriteAccessDwell = 30; // seconds 
var 
    SR: TSearchRec; 
    LastAccess: TDateTime; 

... 
if LastWriteWithin(SR.FindData.ftLastWriteTime, LastWriteAccessDwell, LastAccess) then 
begin 
    WriteText(format('Last Access @%s was less than %d seconds.', [DateTimeToStr(LastAccess), LastWriteAccessDwell])); 
    continue; 
end; 

function LastWriteWithin(FileTime: TFileTime; const Seconds: Cardinal; out LastAccess: TDateTime): boolean; 
var 
    LocalFileTime: TFileTime; 
    iFileAge: integer; 
begin 
    if Not(FileTimeToLocalFileTime(FileTime, LocalFileTime) 
     and FileTimeToDosDateTime(LocalFileTime, LongRec(iFileAge).Hi, LongRec(iFileAge).Lo)) then 
    RaiseLastOSError; 

    LastAccess:= FileDateToDateTime(iFileAge); 
    result:= WithinPastSeconds(Now, LastAccess, Seconds); 
end; 
+0

不控制发送。从非现场服务器发送到我们的服务器。我们的应用程序查找文件夹更改 – 2010-05-25 21:49:47

3

如何FTP服务器?也许是服务器的一个插件,当文件传输完成时,只要收到正面完成回复(2xx服务器返回)时就会触发事件。

通过ftp发送文件可能会中断并暂停未知的时间,您永远无法假定它们已完成。我认为完成(或甚至文件传输没有错误)的唯一方法是通过FTP服务器。

+0

你在使用什么样的服务器?几年前,我为服务器创建了一个插件。 除了使用服务器告诉你文件传输何时完成,您可以使用带有上传文件的sfv文件。该sfv文件将包含CRC32校验和。然后,上传者将不得不创建sfv文件。 或者你可以做类似robsofts想法的东西,并将散列值修改为文件名。但是,你又依赖于上传者。 – Logman 2010-05-26 13:51:51

0

不知道你的FTP服务器是如何工作的,但是我会定期检查你是否可以独占打开文件,因为它可能在文件传输过程中打开并在完成时关闭。

0

我总是用来做下面的事情;

 
a) get the size of the file, in bytes 
b) append this to the filename eg MyFile.Dat.16384 
c) send the file over ftp etc 

在另一端,您有一个程序正在观看FTP传入文件夹。每隔一秒左右(根据适合情况调整),您扫描文件夹中的文件,当您找到文件大小与文件名末尾的字符串匹配的文件时,可以合理确定它已到达并可自由移动,重命名,随你。

我们在扫描中建立了一些逻辑,使得文件在扫描中第二次出现时才被触发,只是为了确保最后一秒左右的可能的处理/解锁部分FTP服务器。

这对于Delphi来说相当简单,它实际上只是一个循环中的findfirst/findnext/findclose类型结构,运行在定时器上。开始扫描时关闭计时器,完成后重新启动计时器。

+0

我们正在控制第二个进程,而不是ftp部分。所以我们需要能够知道文件已经完成传输,然后我们将该文件移动到网络中的另一个位置。 – 2010-05-28 17:36:37

0

可以通过在发件人端生成校验和(MD5,sha1等)来增强robsoft的答案。只要接收者看到文件名.16384 =文件大小16384它也可以比较校验和100%确定文件到达确定!

@Linux:见sha1sums,MD5SUMS

[如何知道一个文件被拷贝完(的