【问题标题】:Check sftp file transfer completed?检查 sftp 文件传输是否完成?
【发布时间】:2012-12-03 14:26:20
【问题描述】:

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 您好,谢谢。 “这仅在写入文件的进程也以某种方式打开文件以使其被独占锁定时才有效” - 这是一个 sftp 选项还是进程何时以某种方式写入/打开文件?
    • SFTP 协议中没有这样的选项。这取决于您用作服务器的应用程序以及开发人员如何实现文件打开部分。
    猜你喜欢
    • 2013-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-05
    • 1970-01-01
    • 1970-01-01
    • 2019-03-13
    相关资源
    最近更新 更多