在另一个进程尝试移动/复制该文件之前,确保通过ftp传输的文件已完成的最佳方法是什么?如何确定文件是否已完成传输以便能够复制
回答
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;
不控制发送。从非现场服务器发送到我们的服务器。我们的应用程序查找文件夹更改 – 2010-05-25 21:49:47
如何FTP服务器?也许是服务器的一个插件,当文件传输完成时,只要收到正面完成回复(2xx服务器返回)时就会触发事件。
通过ftp发送文件可能会中断并暂停未知的时间,您永远无法假定它们已完成。我认为完成(或甚至文件传输没有错误)的唯一方法是通过FTP服务器。
你在使用什么样的服务器?几年前,我为服务器创建了一个插件。 除了使用服务器告诉你文件传输何时完成,您可以使用带有上传文件的sfv文件。该sfv文件将包含CRC32校验和。然后,上传者将不得不创建sfv文件。 或者你可以做类似robsofts想法的东西,并将散列值修改为文件名。但是,你又依赖于上传者。 – Logman 2010-05-26 13:51:51
不知道你的FTP服务器是如何工作的,但是我会定期检查你是否可以独占打开文件,因为它可能在文件传输过程中打开并在完成时关闭。
我总是用来做下面的事情;
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类型结构,运行在定时器上。开始扫描时关闭计时器,完成后重新启动计时器。
我们正在控制第二个进程,而不是ftp部分。所以我们需要能够知道文件已经完成传输,然后我们将该文件移动到网络中的另一个位置。 – 2010-05-28 17:36:37
可以通过在发件人端生成校验和(MD5,sha1等)来增强robsoft的答案。只要接收者看到文件名.16384 =文件大小16384它也可以比较校验和100%确定文件到达确定!
@Linux:见sha1sums,MD5SUMS
[如何知道一个文件被拷贝完(的- 1. 如何确定文件何时完成复制以便进一步处理?
- 2. 如何确定文件是否已完成python下载
- 3. 获取Jtextarea以便能够被复制
- 4. 如何确定是否SkinnableComponent已完成添加部件?
- 5. 检查文件是否完成复制
- 6. 确定javascript是否已完成
- 7. 确定AutoBoxing是否已完成
- 8. 如何使用jQuery检测文件上传是否已完成?
- 9. VBA复制文件; surpress“文件已经存在”并确定是否成功?
- 10. 如何确定“投递文件夹”中的文件是否完全传输
- 11. Netty:如何确定文件是否已完整发送?
- 12. 如何将默认语言resx复制到语言特定的resx文件以便能够生成资源DLL?
- 13. 如何确定dojo网格是否已完成加载?
- 14. 如何确定装配是否已经完成?
- 15. 如何确定AVM1Movie是否完成?
- 16. 如何识别上传的文件是否已完全上传?
- 17. 如何确定是否使用可可完成文件副本
- 18. 如何测试一个文件是否以.NET完全复制
- 19. 如何确定文件是否仍然通过ftp传输
- 20. 确定是否向UIPasteboard复制成功
- 21. 如何确保完成TCP文件传输(C++)
- 22. 如何复制能够取消复制的文件?
- 23. 如何确定是否已在MongoDB中完成完整集合扫描
- 24. php如何测试文件是否已完全上传
- 25. 如何判断文件是否已经在PHP中上传完成?
- 26. 如何检查$ compile是否已完成?
- 27. 复制完成的文件?
- 28. 文件复制完成?
- 29. FTP确认传输完成
- 30. 确定文件是否已更改
可能重复http://stackoverflow.com/questions/559659/how-to-know-a-file-完成复制) – 2010-05-25 22:22:59