为何 Mac 系统在编辑一个文件时,还可以更改这个文件名,或者移动甚至删除它?

2018-12-27 09:26:40 +08:00
 maxxfire

为何 Mac 系统在编辑一个文件的同时,还可以更改这个文件名,或者将这个文件移到到其它位置,甚至可以将它删除到回收站。还不影响对这个文件的编辑。

我怀疑这个特性可能 iOS 系统也有。

也就是说 mac/ios 在底层并不是通过文件名和路径去定位一个文件吗? 那么到底是通过什么去定位的?

2967 次点击
所在节点    macOS
17 条回复
misaka19000
2018-12-27 09:33:44 +08:00
我记得这些信息好像只存在 inode 里面的,具体记不太清了
b821025551b
2018-12-27 09:36:42 +08:00
因为读到内存了呀,只有 Windows 才不能删除吧
maxxfire
2018-12-27 09:37:35 +08:00
@misaka19000 有可能,但是要能通过 inode 反向检索出最终变化后的路径。
xiaoxinxiaobai
2018-12-27 09:40:21 +08:00
各种*unix 都可以,在 win 下不可以,具体可以看看文件系统
shawnbluce
2018-12-27 09:47:37 +08:00
@misaka19000 我觉得也是,刚刚我在我的 Linux 上 vim 了一个文件,编辑了些内容保存。ls -li 看到了一个 inode,然后把文件删除,再从 vim 中保存一次,再 ls -li 看到的 inode 是相同的。

[![2018-12-27_09-46.png]( https://i.loli.net/2018/12/27/5c242f2230958.png)]( https://i.loli.net/2018/12/27/5c242f2230958.png)
reself
2018-12-27 09:47:57 +08:00
这个是优点,不要被 Windows 惯坏了,Windows 下经常遇到文件被占用无法编辑,更新软件必须重启也是这个原因,用重启来解除文件占用,特别恶心
gowa2017
2018-12-27 09:50:45 +08:00
看要 apue 里面的内容会帮助你
maxxfire
2018-12-27 09:55:33 +08:00
@gowa2017 恩,查了一下,确实也可以反向检索路径 vn_fullpath: https://www.freebsd.org/cgi/man.cgi?query=vn_fullpath&sektion=9
zjj19950716
2018-12-27 10:42:25 +08:00
平滑升级
UnknownR
2018-12-27 10:51:03 +08:00
文件描述符吧应该是,unix like 系统独有,windows 下不一样
lcdxiangzi
2018-12-27 11:01:54 +08:00
@b821025551b WINDOWS 如果用 notepad 打开也是可以直接删除移动的。
geelaw
2018-12-27 11:17:53 +08:00
很多文本编辑器是不会 hold the file exclusively 的。

@shawnbluce #5 这个可能是 inode reuse 导致的也可能是其他原因,你应该移动该文件然后再试。


@b821025551b #2 @xiaoxinxiaobai #4
取决于文件是否被打开、文件打开时删除权限是否被共享。

@reself #6 文件被占用的时候可以选择关闭占用文件的程序,或者不使用 not behaving 的程序(比如不使用独占文件的程序)。

如果要更新的文件被操作系统占用(逻辑上,而不是指文件被 System process 持有句柄),则重启才能修改,这是 by design,具体可以看这篇 https://docs.microsoft.com/en-us/previous-versions/technet-magazine/cc983682(v=msdn.10)

@UnknownR #10 文件描述符是对打开的文件的 handle,等同于 Windows 里面的 HANDLE 的一种情况。

——————

回到楼主的问题,这取决于文件是否仍然打开。

基本上所有的文件系统都有 路径 变换到 文件 的接口(一个文件可以有多个路径,它们都是该文件的 hard links )。

文件打开后,就不再和打开它的路径关联(通常来说,打开的文件不记得自己是从哪个 hard link 打开的)。
很多文本编辑器都会选择打开文件、读取、关闭,记住路径,然后用户保存的时候重新打开(该路径上的文件,它可能已经变化过了)、保存、关闭。
Office 系列是会保持文件被独占的。

如果文件打开时没有被禁止删除,则其他程序仍然可以删除文件。(类似地,一个文件打开的时候没有被禁止读取,则其他程序仍然可以以读取的方式打开文件。)

此外,楼主应该了解 OS API 和 FS API 的区别。并不是所有的 FS API 都会被 OS API 忠实表现,例如 NTFS 是大小写敏感的文件系统,其 API 当然也是大小写敏感的;然而 Win32 API 是大小写不敏感的,即使底层文件系统是 NTFS。
b821025551b
2018-12-27 12:12:49 +08:00
@lcdxiangzi #11 notepad 打开的不是原来的文件,而是一份副本,副本依然不能被删除。
meik2333
2018-12-27 12:47:24 +08:00
记得 apue 里面提到过,删除文件只是 unlink 了一个链接,如果有程序正在使用这个文件的文件描述符的话,那这个文件是并不会被删除的。只有所有的占用都结束后,文件才会真的被删除。
geelaw
2018-12-27 12:51:07 +08:00
@b821025551b #13 瞎编也不是这么编的。当然你可以说我 notepad “把文件复制了一份到内存里”,但是不能随便控制其他进程的内存本来就是进程的意义之一。
geelaw
2018-12-27 12:52:41 +08:00
@geelaw #15 原来 #2 这位知道能读到内存里而且不觉得那是复制了文件,那就有点莫名其妙了。
TonyLiu2ca
2018-12-28 13:34:26 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/521387

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX