2013-11-28 35 views
0

我正在尝试使用熔丝实现内存中文件系统。重命名函数接受'from'和'to'参数。在熔丝文件系统中实现重命名

当我试图在bash中这样做, MV文件1文件2, 它在内部调用更名功能(我用-d选项检查)。

当我尝试在GUI中重命名该函数时,它再次调用重命名函数。

但是,如果file2是已经存在的文件,则mv命令覆盖它,而GUI禁止我重命名该文件。我该如何执行这个约束,因为这两个操作在内部都没有区别地调用重命名函数。

+0

为什么你认为'mv'的行为对于你的文件系统来说比任何其他文件系统都不同? –

+2

Afaik获得该行为的唯一方法是在调用'rename'之前检查文件是否作为单独的操作存在。我猜你所描述的GUI是这样做的。 –

+0

我不认为MV是不同的。我担心的是,当我做mv file1 file2时,如果file2已经存在,它将被覆盖。如果我对gui重新命名,它会阻止我。当我的代码在内部调用重命名函数时,如何处理它。 – Torpedo

回答

1

rename函数用原子替换目标文件并删除旧名称。这是它的全部要点,如果它没有做到这一点,那么各种事情就会崩溃。对于想要防止重命名在另一个文件之上的应用程序,他们必须先使用link函数(如果目标存在,将会失败),然后在link成功时使用旧名称unlink

+0

或者,甚至更简单,GUI可能只是检查其他文件名是否正在使用并显示错误(如果是)。这不是原子,当然,但在GUI文件管理器中这不太可能是重要的。 – duskwuff

+0

@duskwuff:的确,我怀疑这是大多数破坏的GUI软件的工作方式......但这并不意味着我们应该宽恕它。实际上,如果您在一个窗口中进行大量复制/移动操作,并且磁盘颠簸/交换不良,并且在另一个窗口中以交互方式重命名文件,这可能很重要。 –

+1

虽然你不能总是使用'link()'。并不是所有的文件系统都支持硬链接(例如FAT),有些(如HFS +)可能需要做很多额外的工作来处理链接/取消链接。 – duskwuff