原文: Virtual Files
虚拟文件 com.intellij.openapi.vfs.VirtualFile 指 IntelliJ Platform’s 虚拟文件系统的文件. 大多数情况,我们说一个文件是指本地文件系统的文件. 在IntelliJ Platform中,由于平台灵活地支持多类文件系统,所以虚拟文件同时也可以指代JAR包里的类文件、版本控制系统中历史版本的文件等等。
VFS级别的文件只支持二进制内容。你可以通过流(stream)的方式读写VirtualFile
的二进制数据,编码、行分隔符这类概念只被更高的系统级别支持。
如何获取一个虚拟文件
- 从action获得:
e.getData(PlatformDataKeys.VIRTUAL_FILE)
.
如果你选择了多个文件,使用:e.getData(PlatformDataKeys.VIRTUAL_FILE_ARRAY)
. - 使用本地文件系统上的路径:
LocalFileSystem.getInstance().findFileByIoFile()
- 从PSI文件 :
psiFile.getVirtualFile()
(如果PSI文件只存在于内存中,返回null) - 从Document中:
FileDocumentManager.getInstance().getFile()
我可以用它做什么?
支持所有的传统文件操作,比如 遍历整个文件系统、获取文件内容、重命名、移动、删除。遍历操作应该使用VfsUtilCore.iterateChildrenRecursively
来避免符号链接造成的无限循环。
虚拟文件系统如何建立?
VFS由系统在项目根目录自上而下地扫描并建立。新文件由VFS的refreshes操作检测。这一操作由VirtualFileManager.getInstance().refresh()
或 VirtualFile.refresh()
方法触发。也会在文件系统watchers接收到文件系统变化的通知时触发(Windows和Mac操作系统上存在)。
作为一个插件开发者,当你需要访问由外部工具通过IntelliJ Platform 的API新创建的文件时,你需要先执行VFS的refresh操作。
一个虚拟文件的生命周期?
硬盘上的一个文件对应的VirtualFile
实例有着喝IDEA进程相同的生命周期。同一个文件可能有多个实例,这些实例都可被回收。这个文件本体是用户数据的载体
,用户数据同个这个文件在多个实例间共享数据。如果文件本体删除,它对应的多个VirtualFile
都会失效(isValid()
方法反悔false
,对它的操作会抛出异常)。
如何创建一个虚拟文件?
通常你不需要这么做。按照规则,文件通常使用PSI API或常规的java.io.File API创建。
如果你想通过VFS创建文件,你可以使用VirtualFile.createChildData()
方法创建一个VirtualFile
实例,然后使用VirtualFile.setBinaryContent()
方法往文件里写数据。
如何获取VFS改变的通知?
VirtualFileManager.addVirtualFileListener()
方法可以接收到VFS的所有改变行为。
如何扩展VFS?
实现一个第三方的文件系统(比如FTP文件系统),需要实现 VirtualFileSystem
接口(大多数时候也要提供 VirtualFile
的实现),并且把你的实现注册成一个application component
.。
若要把这些这些文件操作应用到本地文件系统上(比如,你再开发一个版本控制系统,需要自定义重命名/移动操作),你应该实现LocalFileOperationsHandler
接口,并通过LocalFileSystem.registerAuxiliaryFileOperationsHandler
方法注册它。
VFS的工作细则?
到IntelliJ Platform Virtual File System 查看VFS架构和使用指引的更多细节。
网友评论