我认为这个问题对于Stack Overflow来说已经足够技术性了,对于 Android
来说也可能面向编程。我对在Android(或Java或Linux,视情况而定)中如何处理文件很感兴趣,因为我在新的智能手机上做了一些事情,而且我很想知道它是如何发生的。
我正在通过蓝牙将文件从笔记本电脑传输到Android手机。我在文件浏览器中看到了新文件,并假设它已完全传输,因此将其从/sdcard/bluetooth
移到/sdcard/torrents
。完成此操作后,我发现它实际上仍在转移。令我惊讶的是,它成功完成了,并通过电话上的通知图标进行确认,并通过双方的手动MD5检查。在大多数系统中,文件移动会导致崩溃。
此次成功转移的原因是什么?我知道,通常,文件路径与文件系统上的文件位置(在本例中为SD卡)分开。我想象蓝牙应用程序已经打开了文件的句柄,当我移动文件时,“打开文件”表已更新为新路径。此功能通常在任何Linux系统上都适用吗?我可以mv
对正在写入的文件进行操作,并期望副本在新位置正确吗?
当您 在同一文件系统内 移动 文件时 ,文件本身( inode
)根本不会移动。唯一更改的是该文件系统中的目录条目。(mv
在这种情况下,由调用的系统调用是rename(2)
-检查该页面以获取其他信息和限制。)
当进程打开文件时,文件名将传递到操作系统以指示文件的含义,但是您返回的文件描述符根本没有链接到该名称(您无法从文件名中获取文件名)–它链接到索引节点。
由于在重命名文件时(在同一文件系统内)索引节点保持不变,因此打开该索引的进程可以很高兴地继续对其进行读取和写入操作-
对它们没有任何更改,它们的文件描述符仍然有效并指向正确的数据。
如果删除文件,也是一样。即使文件无法通过任何目录条目访问,进程也可以继续对其进行读写。(这可能会导致令人困惑的情况,即df
报告磁盘已满,但du
表示您使用的df
报告空间要少得多。分配给仍打开的已删除文件的块只有在这些进程关闭其文件描述符后才会释放。
)
如果在mv
文件系统之间移动文件,则行为会有所不同,因为inode特定于每个文件系统。在这种情况下,mv
将实际复制数据,从而在目标文件系统上创建一个新的inode(和目录条目)。复制结束后,旧文件将取消链接,
如果 上面没有打开的文件句柄,则将其删除,如上所述。
就您而言,如果您跨越了文件系统边界,则目标中将包含部分文件。并且您的上传过程愉快地写入了您无法轻松访问的已删除文件,可能会填满该文件系统,直到上传完成,此时索引节点将被删除。
您会在Unix和Linux上发现一些有趣的帖子:
问题内容: 这是代码片段。 编辑:我正在从目录中读取文件。因此,我需要在每个循环中打开阅读器。我进行了一些修改,但同时也没有写入该文件。这是代码: 编辑:我修改了代码,但没有成功, 而且我收到此错误: 编辑:谢谢..我想通了。实际上,我在eclipse中创建了一个目录,但没有刷新它来查看内容。真是太傻了…还是非常感谢 问题答案: 您正在循环内创建FileWritter,因此您将始终在每个循环中截断
问题内容: 我必须阅读tomcat日志文件,并在一段时间(例如:一个小时)后再次读取该文件(仅针对新添加的内容),因此我创建了RandomAccessFile来记录我完成的最后一个位置并使用BufferedReader.readLine()方法。 但是,我发现有时我无法读取文件的整行。 例如,tomcat正在尝试编写以下内容(仅作为示例): 192.168.0.0本地主机/index.html .
问题内容: 我想到了一个并发问题( 在Solaris中 ),如果在读取某人时尝试删除同一文件会发生什么。我有一个关于 Solaris / Linux中 文件存在的查询。假设我有一个文件test.txt,已经在vi编辑器中将其 打开 ,然后打开了一个重复的会话并 删除了 该文件,但是即使删除了该文件,我仍然可以读取该文件。所以这是我的问题: 我在读取时是否需要考虑任何 锁定 机制,所以没有人能够在读
问题内容: 平台:Debian Wheezy 3.2.0-4-686-pae 编译器:GCC(Debian 4.7.2-5)4.7.2(代码:: Blocks) 我想将文件从一个位置移动到另一位置。移动到不同的驱动器或文件系统没有什么复杂的。我知道执行此操作的“标准”方法是简单地复制文件,然后删除原始文件。但是我想要某种方式来保留文件的所有权,模式,上次访问/修改等。我假设我必须先复制文件,然后再
问题内容: [我已经以二进制模式将csv文件移动到Linux系统中。一个字段的文件内容被分成多行,其注释部分,我需要删除新行,保持相同的格式,请在shell命令或perl命令上提供帮助 这是三个记录的示例,实际看起来像] 文件的原始内容 [进入linux后,注释字段分为4行,我想保持注释字段的格式相同,但不希望换行符 “第一行 第二行 第三行所有行格式都不应更改”] 2 问题答案: 正如我在上面的
问题内容: 我一直在尝试找到一种使用Node.js时写入文件的方法,但是没有成功。我怎样才能做到这一点? 问题答案: 文件系统API中有很多详细信息。最常见的方法是: