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