为何 Mac 系统在编辑一个文件的同时,还可以更改这个文件名,或者将这个文件移到到其它位置,甚至可以将它删除到回收站。还不影响对这个文件的编辑。
我怀疑这个特性可能 iOS 系统也有。
也就是说 mac/ios 在底层并不是通过文件名和路径去定位一个文件吗? 那么到底是通过什么去定位的?
1
misaka19000 2018-12-27 09:33:44 +08:00 via Android
我记得这些信息好像只存在 inode 里面的,具体记不太清了
|
2
b821025551b 2018-12-27 09:36:42 +08:00
因为读到内存了呀,只有 Windows 才不能删除吧
|
3
maxxfire OP @misaka19000 有可能,但是要能通过 inode 反向检索出最终变化后的路径。
|
4
xiaoxinxiaobai 2018-12-27 09:40:21 +08:00 via Android
各种*unix 都可以,在 win 下不可以,具体可以看看文件系统
|
5
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) |
6
reself 2018-12-27 09:47:57 +08:00 via Android 1
这个是优点,不要被 Windows 惯坏了,Windows 下经常遇到文件被占用无法编辑,更新软件必须重启也是这个原因,用重启来解除文件占用,特别恶心
|
7
gowa2017 2018-12-27 09:50:45 +08:00 via iPhone
看要 apue 里面的内容会帮助你
|
8
maxxfire OP @gowa2017 恩,查了一下,确实也可以反向检索路径 vn_fullpath: https://www.freebsd.org/cgi/man.cgi?query=vn_fullpath&sektion=9
|
9
zjj19950716 2018-12-27 10:42:25 +08:00 via iPhone
平滑升级
|
10
UnknownR 2018-12-27 10:51:03 +08:00
文件描述符吧应该是,unix like 系统独有,windows 下不一样
|
11
lcdxiangzi 2018-12-27 11:01:54 +08:00
@b821025551b WINDOWS 如果用 notepad 打开也是可以直接删除移动的。
|
12
geelaw 2018-12-27 11:17:53 +08:00 1
很多文本编辑器是不会 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。 |
13
b821025551b 2018-12-27 12:12:49 +08:00
@lcdxiangzi #11 notepad 打开的不是原来的文件,而是一份副本,副本依然不能被删除。
|
14
meik2333 2018-12-27 12:47:24 +08:00
记得 apue 里面提到过,删除文件只是 unlink 了一个链接,如果有程序正在使用这个文件的文件描述符的话,那这个文件是并不会被删除的。只有所有的占用都结束后,文件才会真的被删除。
|
15
geelaw 2018-12-27 12:51:07 +08:00 via iPhone
@b821025551b #13 瞎编也不是这么编的。当然你可以说我 notepad “把文件复制了一份到内存里”,但是不能随便控制其他进程的内存本来就是进程的意义之一。
|
17
TonyLiu2ca 2018-12-28 13:34:26 +08:00
|