我一直在想一些事情,像 youtube 这样的网站(pandora 做 mp4s)
- 通过 Flash 播放器播放他们的音乐
- 在播放每个曲目时,它们会被下载到用户的计算机上,例如 /tmp/FlashXX*****
这允许用户将 flv 移出该文件夹以供以后播放。
但是,当用户将 flv 移出 /tmp 文件夹时,播放器会继续播放音乐/视频,非常愉快。Flash 播放器如何处理其文件的删除,为什么它不会由此引发错误?
更重要的是,如果没有flvs,播放器玩得开心,为什么首先下载给用户?
这实际上与缓存无关。相反,它是由于 Unix 文件系统的工作方式而起作用的。打开文件时,会读取其 inode 并指示数据在磁盘上的位置。当文件被移动或删除(“取消链接”)时,inode 将移动到新位置或从目录中删除。但是,它指向的数据不会失效,直到不存在对该 inode 的引用。换句话说,只要文件保持打开状态,删除或移动它就不会影响读取该文件的程序。
这不是 Windows 文件系统的工作方式,而是在尝试删除正在使用的文件时导致常见的“文件被锁定”问题。(免责声明:支持硬链接的 NTFS 可能不是这样,但我很确定 FAT 就是这种情况。)
它工作得非常好,有时程序甚至会使用一种技巧来自动清理,方法是创建一个文件并立即“删除”它,同时保持打开状态。这样,临时文件可以继续使用,直到程序完成它,此时它会自动“消失”。
顺便说一句,如果您移动它们,希望能够关闭和重新打开临时文件的程序会感到困惑。您可以通过使用硬链接进行“复制”来避免这种情况。
ln /tmp/Fl* .
该命令将创建临时文件的 Flash 引用的 inode 副本到当前目录中。它实际上并没有复制文件的内容,只是创建了对磁盘上相同数据的第二个引用。这样,当 Flash 关闭时,您仍然有一个指向它释放的数据的“指针”。
我已经有一段时间没有研究过这个话题了,我可能弄错了一些术语,所以我建议如果你想进一步理解,请阅读 inode 以及硬链接的工作原理。
从那个维基百科链接:
取消链接的过程将名称与卷上的数据分离,而不会破坏关联的数据。只要至少有一个指向数据的链接仍然存在,数据就仍然可以访问。当最后一个链接被删除时,该空间被认为是空闲的。
即使从临时文件夹中删除文件后,内容也会继续播放,因为 Flash 已将文件读入内存以显示它。这在概念上与为什么将本地存储的图像拖到浏览器中的原因相同,如果您随后删除文件,浏览器不会停止显示图像。
至于为什么文件被存储,它只是被缓存,就像您的浏览器显示的任何其他文件一样,因此如果您重新加载页面,您将不必(必然)重新加载媒体文件。
但是,对于视频,所有这一切都可能需要注意 - 例如,如果您在视频中向前或向后搜索,我无法发誓如果缓存版本已被删除,是否会从内存中播放视频......我可以想象在某些情况下,Flash 不会将整部电影保存在内存中。但作为一般情况的答案,事情应该如此处所述。
我假设您正在描述 *nix 系统上的行为?
他们可能只是在使用类似这样的东西、或inotify或这个 .NET 事件来监视文件系统。如果现代版本的 Windows 允许您移动临时 .flv 文件,我会感到惊讶,如果 flash 没有因此而消失,那将是疯狂的。
但是,是的,我的猜测是,在您的操作系统上,当文件移动时,flash player 不会受到影响,因为它接收到新路径的句柄,以防它需要再次从文件中读取。如果您在播放较长(例如,约一小时)的视频时故意更改权限或损坏或删除 .flv,会发生什么情况?