如果Perl尝试在正在上传的文件上调用move()函数会发生什么?

12

有人正在将大小为10Mb的文件FTP到Linux服务器上的文件夹中。 在文件传输过程中,一个定时任务启动并触发了一个Perl脚本,该脚本旨在查看ftp文件夹并将找到的内容移动到某个备用文件夹中。我使用了File::Copy中的move()函数。作为其任务的一部分,Perl进程实际上会重命名文件。这是否重要?或者FTP不关心文件系统如何描述文件?

move()会成功移动部分文件而使FTP做什么呢? 还是会失败并返回0?


感谢您为我的问题投票支持! :) - Yevgeny Simkin
3
相对于 Windows,Linux 最大的特点之一(我个人认为)就是你可以对已打开文件进行操作,如移动、重命名甚至删除,而已经打开该文件的应用程序不会察觉到。你甚至可以在程序运行的同时删除它们,它们依然能够正常运行(但一旦它们退出,就再也无法找回它们了……)。 - rmeador
move()是什么,它将东西移动到哪里?它是否可能复制文件而不仅仅是重命名它们? - brian d foy
它的拼写是“cron”,而不是“chron”。 - Bklyn
3个回答

10

不,移动操作只应该让下载进程在新位置上完成下载过程。你只是将inode从一个位置移动到另一个位置。下载程序的打开文件描述符仍然指向它。

我想重复一下其他人提到的内容。只有当移动操作在同一文件系统上时才有效。如果它在另一个文件系统上,则inode无法被传输,因为它始终属于同一文件系统。最可能的情况是,在程序仍在旧的inode上下载且不再连接到文件的情况下,此时部分数据被复制到新位置。


1
重命名并不重要,因为它不会改变inode。在文件系统中,名称与inode相关联。就你的问题而言,移动和重命名几乎是相同的。一个新文件使用旧文件名只会包含另一个inode,并且不会有问题。以防这是你的下一个问题 :) - Norbert Hartl
2
注意:如果您在文件系统之间移动,上传过程将完成,但是您将无法访问该文件,因为没有对inode的引用存在。您最终会在另一个文件系统上得到一个部分文件。 - Jeff Ferland

5

由于没有标准的move功能,因此很难知道你的情况。如果你想要的是rename,那么你可能不会遇到任何问题,因为主要出现问题的情况是当你将文件从一个文件系统移动到另一个文件系统(因此是复制和删除,而不是真正的移动),在大多数系统中rename将在这种情况下失败。(所以如果你的设置工作正常,就没问题了。)

如果你没有使用rename,而是使用一些可以处理跨文件系统移动的move函数,那么如果涉及多个文件系统,你很可能会得到部分文件。(如果例如,你现在都在一个文件系统上,但后来你上传的这些文件占用了大量空间,并且你添加了一个专门用于存储它们的驱动器-现在你正在进行跨文件系统的移动,这可能会成为一个非常令人讨厌的陷阱。)


我正在使用 Perl 的 move 函数,我认为它只是 mv -src -dest 的一个包装器。具体来说,代码是 move("$ftpDir$inFile","$someOtherDir$newFileName");。 - Yevgeny Simkin
2
如果它是系统/bin/mv的包装器,那么只有在跨文件系统移动文件(现在或将来)时,您才会绝对面临部分文件的危险。 - chaos
只要文件系统相同,你是同意没有任何伤害的吗? - Yevgeny Simkin
好的。但请记住我原始回答中的最后一个括号句子。 - chaos
Perl没有'move'关键字,但它确实有'rename'关键字。如果你正在调用名为'move'的东西,那么它可能是由File::Copy模块导出的&move子例程。如果是这样,查看File::Copy文档会很有帮助。 - converter42

1

我不确定,但很可能不会发生任何错误。移动操作不会改变文件的inode号码,因此FTP服务器将完全不会注意到移动操作,并将继续在新位置写入文件。简而言之,move()操作将成功,并且上传操作将在新位置继续进行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接