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