有人正在将一个 10Mb 大小的文件通过 FTP 传输到 linux 服务器上的文件夹中。当文件处于转换过程中时,一个 cron 会唤醒并触发一个 Perl 脚本,该脚本旨在查看 ftp 文件夹并将在那里找到的任何内容移动到某个备用文件夹。我正在使用File::Copymove()
中的函数。Perl 进程实际上将文件重命名为其任务的一部分。这有关系,还是 FTP 不在乎文件系统将文件描述为什么?
会move()
成功并移动一个部分文件,让FTP做什么?还是会移动失败并返回 0?
有人正在将一个 10Mb 大小的文件通过 FTP 传输到 linux 服务器上的文件夹中。当文件处于转换过程中时,一个 cron 会唤醒并触发一个 Perl 脚本,该脚本旨在查看 ftp 文件夹并将在那里找到的任何内容移动到某个备用文件夹。我正在使用File::Copymove()
中的函数。Perl 进程实际上将文件重命名为其任务的一部分。这有关系,还是 FTP 不在乎文件系统将文件描述为什么?
会move()
成功并移动一个部分文件,让FTP做什么?还是会移动失败并返回 0?
不,移动应该只是让在新位置上完成下载过程。您只是将 inode 从一个位置移动到另一个位置。下载程序的打开文件描述符仍应指向它。
我只想重复其他一些人提到的内容。这仅在移动操作在同一文件系统上时才有效。如果它作为另一个文件系统而不是 inode 无法传输,因为它始终属于同一个文件系统。最可能的情况是,当时的部分数据被复制到新位置,而程序仍然在旧的 inode 中下载,旧的 inode 不再附加到文件中,因此无法使用。
由于没有标准move
,因此很难知道您的场景中发生了什么。如果你的意思是rename
,那么你可能不会有任何问题,因为你的情况会出错的主要方式是如果你将文件从一个文件系统移动到另一个文件系统(因此进行复制和删除,而不是真正的move),并且在大多数系统上,rename
在这些情况下都会失败。(因此,如果您的设置完全有效,那就没问题了。)
如果您没有使用rename
某些move
功能,例如,将处理跨文件系统的移动,那么如果涉及多个文件系统,您很可能会得到一个部分文件。(这可能会成为一个非常讨厌的问题,例如,如果你现在都在一个文件系统上,但后来你上传的这些文件占用了大量空间,并且你添加了一个专门用于存储它们的驱动器——现在你正在做一个跨文件系统的移动。)
我不确定,但很可能不会发生任何错误。移动不会改变文件 inode 编号,因此 FTP 服务器根本不会注意到移动,并会继续写入新位置的文件。简而言之,move()
将成功,上传将在新位置继续。