微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么我可以在写入Linux时成功移动一个文件?

我认为这个问题对S / O来说足够技术,而且可能也是针对Android的面向编程的。 我对如何在Android(或Java或Linux,如适用)中处理文件很感兴趣,因为我用我的新智能手机做了一些事情,我很想知道它是如何发生的。

我正在通过蓝牙将笔记本电脑上的文件传输到我的Android手机中。 我看到文件资源pipe理器中的新文件,假设它已完全传输,并将其从/sdcard/bluetooth移到/sdcard/torrents 。 我这样做之后,我注意到其实还在转移。 令我惊讶的是,它成功地完成了,通过手机中的通知图标进行确认,并通过双方的手动MD5检查。 在大多数系统中,文件移动会导致崩溃。

这个成功转移的原因是什么? 我知道,一般来说,文件path与文件系统上的文件位置(在这种情况下是SD卡)是分开的。 我想蓝牙应用程序已打开文件的句柄,当我做文件移动时,一个“打开的文件”表更新了一个新的path。 这个function在任何Linux系统中都是如此吗? 我可以在正在写入的文件上做一个mv ,并期望在新位置的副本是正确的吗?

即使文件不可读,Java – file.length()也会返回

用于WIndows的内存文件系统

如何创build虚拟文件系统的文件path可以像磁盘一样访问

根据知识产权

为什么inode号从1开始而不是0?

cd / bash在符号链接上的行为

支持目录硬连接的文件系统

FILE_ATTRIBUTE_OFFLINE在Windows Server 2012 R2中不起作用

C ++:以非独占模式打开文件

如何以及何时使用/ dev / shm来提高效率?

同一文件系统中移动文件文件本身( inode )根本不会移动。 唯一改变的是该文件系统中的目录条目。 (在这种情况下,由mv调用的系统调用将被rename(2) – 检查该页面是否有其他信息和限制。)

一个进程打开一个文件时,文件名被传递给操作系统来指明哪个文件是指的,但是你得到的文件描述符根本没有链接到这个名字(你不能从中得到一个文件名)它链接到inode。

由于当你重命名一个文件(在同一个文件系统内)时,inode保持不变,所以打开它的进程可以愉快地继续读和写,没有任何改变,它们的文件描述符仍然是有效的,并指向正确的数据。

同样的事情,如果你删除一个文件。 即使文件不能通过任何目录条目进入,进程也可以继续读写。 (这可能会导致df报告你的磁盘已满的情况,但是du说你使用的空间比df报告的少得多,分配给已删除文件的块仍然是打开的,直到这些进程关闭它们才会被释放文件描述符)。

如果mv跨文件系统移动文件,则行为是不同的,因为inode是特定于每个文件系统的。 在这种情况下, mv将实际上复制数据,在目标文件系统上创建一个新的inode(和目录项)。 当副本结束时,旧文件被取消链接, 如果没有打开的文件句柄,则删除文件,如上所述。

在你的情况下,如果你跨越了一个文件系统的边界,你将在目标中有一个部分文件。 而且你的上传过程愉快地写入一个你不能轻易访问的被删除文件,可能会填满这个文件系统,直到上传完成之后inode会被删除

在Unix和Linux上你可能会发现一些有趣的帖子:

在Unix文件系统中如何实现目录?

什么是超级块,Inode,Dentry和文件

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐