检查sftp文件传输完成了吗?

时间:2012-12-03 14:26:20

标签: c# .net file sftp file-transfer

我们这里有一台Windows服务器,有一天我们将通过sftp获取文件夹中的一些文本文件。我没有更多的信息,但也许这就足够了。现在我应该编写一个将这些文件移动到另一个文件夹的函数。那不应该那么难,我想......但是现在我意识到我能够在文件完成之前移动它。所以我正在寻找一些解决方案,我真的很困惑。

我的解决方案是检查文件及其周围的进程。因为如果文件还没有完成,那么有一个复制过程,我可以检查这个过程。为了简单起见,我只需要尝试锁定文件,如果没有其他进程,那么文件是否可以移动?

using (File.Open("myFile", FileMode.Open, FileAccess.Read, FileShare.None)) 
{ /*rdy!*/ }

但是现在我看到人们正在写关于校验和测试或测试文件大小的内容,如果文件大小没有改变那么文件就准备好了。这个东西有点复杂吗?请告诉我,我的解决方案也可以工作...我无法用任何服务器测试它服务器sftp的东西。我只知道如果我将文件复制到另一个文件夹(通过资源管理器),这是有效的。这是否也通过sftp传输工作?有任何想法吗?谢谢

1 个答案:

答案 0 :(得分:2)

文件大小检查很危险 - 如果上传被暂停并稍后恢复怎么办?在您接受当前文件大小作为最终文件大小之前,应该花多少时间? =>不是一个好的解决方案。

我会去锁定,但是,这只有在写入文件的进程也以某种方式打开文件以便它被独占锁定时才有效。如果该过程不这样做,您将再次遇到问题。

另一种解决方案是使用临时名称上传文件,例如“.sftptmp”。并让上传者在完成后将其重命名。这样你可以确定文件已经上传 - 只需忽略所有以“.sftptmp”结尾的文件。但是,这假设您实际上可以控制上载文件的过程。