我想知道在这种情况下会发生什么?我尝试在网上查找,但没有找到任何明确的答案。
假设我有一个巨大的文件(几 GB)想要传输到 FTP 服务器。我打开 FTP 客户端并点击发送,文件需要几分钟才能上传。
但在上传过程中,我的计算机上的某个程序进入并更新了文件。另一端的文件是什么?
它会损坏吗?或者 FTP 是否有某种完整性检查并意识到文件已更改并重新启动传输?
我目前正在请求 FTP,但这听起来像是一个复杂的问题,所以我想知道其他协议如何处理它?(HTTP,SFTP,rsync 协议,...)
编辑:我之所以问这个问题是因为我正在编写一个需要发送来自文件的数据的协议,并且它需要对这种情况具有弹性
答案1
首先,这取决于操作系统。在某些系统(特别是 Windows)中,程序可能会保持文件打开只,阻止任何其他程序打开同一文件进行写入(或完全阻止,如果需要)。这将是针对更新的最简单的“保护”。
但是,大多数其他操作系统不支持强制锁定,并且始终允许多个程序写入同一文件。然后,这取决于 1) 更新是“就地”完成的,还是通过复制和交换文件完成的,以及 2) FTP 软件是否检查进行修改。
如果另一个程序就地更新文件(打开、查找、写入),则 FTP 客户端在上传该部分后将立即看到其更改。
(这是设计使然;数据库文件格式经常使用并发更新,并在协作程序之间使用咨询锁定来协商哪个程序可以随时更新哪些部分。)
另一方面,如果更新是通过创建新的文件并将其移到旧文件上(文本编辑器经常这样做),那么 FTP 客户端仍然会拥有对新文件的句柄老的文件打开并将不加更改地继续上传。
(如果在 Windows 上执行此操作,编辑器可能无法“保存”文件,因为不允许删除仍保持打开状态的旧版本。其他操作系统允许这样做,并改为进行软删除 - 旧文件将从文件夹中删除,但其数据仍然存在,FTP 客户端可以读取。)
某些程序(最常见的备份系统,例如 tar 或 Borg)会比较文件在传输前后的报告修改时间。如果修改时间已更改,则程序知道文件一定已更改。发生这种情况时,备份工具通常会重试或至少警告用户。
但大多数文件传输客户端不要这样做,服务器也不会这样做。(也许 rsync 除外?)它们假设如果你不想更改文件,你就不会更改它。
我目前正在请求 FTP,但这听起来像是一个复杂的问题,所以我想知道其他协议如何处理它?(HTTP,SFTP,rsync 协议,...)
FTP 作为协议在这里没有什么可提供的,因为它只是网络协议,并没有真正涵盖软件在计算机上如何运行——这种修改检查完全是客户端软件的问题。
(当然,理论上该协议可以要求客户端像在 BitTorrent 中那样对文件进行预散列,但在预散列期间也可能会发生意外更新,在这种情况下该协议再次无法提供任何帮助。)
对于 rsync,我相信客户端软件故意地检查之前/之后的修改时间。