V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
maxxfire
V2EX  ›  macOS

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

  •  
  •   maxxfire · 2018-12-27 09:26:40 +08:00 · 3124 次点击
    这是一个创建于 2188 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    17 条回复    2018-12-28 13:34:26 +08:00
    misaka19000
        1
    misaka19000  
       2018-12-27 09:33:44 +08:00 via Android
    我记得这些信息好像只存在 inode 里面的,具体记不太清了
    b821025551b
        2
    b821025551b  
       2018-12-27 09:36:42 +08:00
    因为读到内存了呀,只有 Windows 才不能删除吧
    maxxfire
        3
    maxxfire  
    OP
       2018-12-27 09:37:35 +08:00
    @misaka19000 有可能,但是要能通过 inode 反向检索出最终变化后的路径。
    xiaoxinxiaobai
        4
    xiaoxinxiaobai  
       2018-12-27 09:40:21 +08:00 via Android
    各种*unix 都可以,在 win 下不可以,具体可以看看文件系统
    shawnbluce
        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)
    reself
        6
    reself  
       2018-12-27 09:47:57 +08:00 via Android   ❤️ 1
    这个是优点,不要被 Windows 惯坏了,Windows 下经常遇到文件被占用无法编辑,更新软件必须重启也是这个原因,用重启来解除文件占用,特别恶心
    gowa2017
        7
    gowa2017  
       2018-12-27 09:50:45 +08:00 via iPhone
    看要 apue 里面的内容会帮助你
    maxxfire
        8
    maxxfire  
    OP
       2018-12-27 09:55:33 +08:00
    @gowa2017 恩,查了一下,确实也可以反向检索路径 vn_fullpath: https://www.freebsd.org/cgi/man.cgi?query=vn_fullpath&sektion=9
    zjj19950716
        9
    zjj19950716  
       2018-12-27 10:42:25 +08:00 via iPhone
    平滑升级
    UnknownR
        10
    UnknownR  
       2018-12-27 10:51:03 +08:00
    文件描述符吧应该是,unix like 系统独有,windows 下不一样
    lcdxiangzi
        11
    lcdxiangzi  
       2018-12-27 11:01:54 +08:00
    @b821025551b WINDOWS 如果用 notepad 打开也是可以直接删除移动的。
    geelaw
        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。
    b821025551b
        13
    b821025551b  
       2018-12-27 12:12:49 +08:00
    @lcdxiangzi #11 notepad 打开的不是原来的文件,而是一份副本,副本依然不能被删除。
    meik2333
        14
    meik2333  
       2018-12-27 12:47:24 +08:00
    记得 apue 里面提到过,删除文件只是 unlink 了一个链接,如果有程序正在使用这个文件的文件描述符的话,那这个文件是并不会被删除的。只有所有的占用都结束后,文件才会真的被删除。
    geelaw
        15
    geelaw  
       2018-12-27 12:51:07 +08:00 via iPhone
    @b821025551b #13 瞎编也不是这么编的。当然你可以说我 notepad “把文件复制了一份到内存里”,但是不能随便控制其他进程的内存本来就是进程的意义之一。
    geelaw
        16
    geelaw  
       2018-12-27 12:52:41 +08:00 via iPhone
    @geelaw #15 原来 #2 这位知道能读到内存里而且不觉得那是复制了文件,那就有点莫名其妙了。
    TonyLiu2ca
        17
    TonyLiu2ca  
       2018-12-28 13:34:26 +08:00
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2989 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 104ms · UTC 14:00 · PVG 22:00 · LAX 06:00 · JFK 09:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.