代码之家  ›  专栏  ›  技术社区  ›  Feyyaz Phill Pafford

使用ftp“append”命令

  •  1
  • Feyyaz Phill Pafford  · 技术社区  · 14 年前

    我想以编程方式将文件上传到FTP服务器(C++)。如果上传文件时连接断了,我不想从头上传文件,只想上传我没有发送的部分。

    APPE命令能满足我的要求吗?我应该准确地使用哪个ftp命令列表?怎么办?

    2 回复  |  直到 14 年前
        1
  •  5
  •   Martin Wickman    14 年前

    检查 RFC 尤其是 APPEND 命令:

    这个 命令使服务器DTP 接受通过 数据连接和存储数据 在服务器站点的文件中。如果 路径名中指定的文件存在 在服务器站点,然后是数据 应附在该文件之后; 否则,在 路径名应创建在 服务器站点。

    请注意,不能再简单地追加同一个文件。您应该发送剩余的字节。也就是说,当连接断开时,在同一位置继续。

        2
  •  6
  •   CallMeLaNN    14 年前

    我在google上搜索关于appe ftp命令的详细信息,它实际上做了什么,但大多数站点只声明append。然后我尝试使用该命令以确保它的行为符合预期。

    我设计了一个ftp自动发送器,用于将日志文件从计算机发送到服务器进行报告。我只想发送日志文件的最后一行。

    当使用appe命令时,它实际上会附加整个文件内容,并附加到服务器中现有的内容。这将导致行条目重复。

    答案是: 要在上次传输失败时恢复文件,没有这样的命令,但我们需要使用一系列命令来实现。

    这里的关键点是,如果使用appe命令或command rest,则将本地文件搜索到最后上载的字节。REST将在特定字节的起始位置开始传输。在建立连接后,我将使用此解决方案执行以下操作:

    使用appe(我从filezilla日志中得到了这个想法):

    1. 使用大小检查文件是否存在并将其用作恢复标记。
    2. 打开本地文件系统并在标记上搜索。
    3. 使用appe进行上传,ftp服务器自动追加。

    将stor与rest结合使用(我从edtfpnet得到了这个想法):

    1. 使用大小检查文件是否存在并将其用作恢复标记。
    2. 发送带有从大小中得到的结果的rest,告诉ftp服务器在该位置开始写入。
    3. 打开本地文件系统并在标记上搜索。
    4. 使用stor作为正常上传。

    注意,并非所有的FTP服务器都支持这两种方式。我看到filezilla根据服务器的不同,双向切换。我的观察表明使用休息是标准的方法。下载还可以使用rest在给定的字节位置开始下载。

    请记住,使用对ASCII传输类型的恢复支持将产生意外的结果,因为UNIX和Windows的换行字节计数不同。

    尝试操作filezilla以查看日志中的行为。 您还可以检查这个有用的.NET库的开源ftp,了解它们是如何操作的。 edtFTPnet