IntelliJ Platform SDK DevGuide

Edit page

Virtual Files

虚拟文件com.intellij.openapi.vfs.VirtualFile是* IntelliJ平台的文件表示 在文件系统(VFS)中. 最常见的是,虚拟文件​​是本地文件系统中的文件. 但是, IntelliJ Platform *支持多个可插入文件系统实现,因此虚拟文件也可以表示JAR文件中的类,从版本控制存储库加载的文件的旧版本,等等.

VFS级别仅处理二进制内容. 您可以将“VirtualFile”的内容作为字节流获取或设置,但编码和行分隔符等概念在较高的系统级别上处理.

##如何获取虚拟文件?

*来自一个动作:e.getData(PlatformDataKeys.VIRTUAL_FILE). 如果您对多重选择感兴趣,还可以使用e.getData(PlatformDataKeys.VIRTUAL_FILE_ARRAY).

*来自本地文件系统中的路径:LocalFileSystem.getInstance().findFileByIoFile()

*来自PSI文件:psiFile.getVirtualFile()(如果PSI文件仅存在于内存中,则可能返回null)

*来自文档:FileDocumentManager.getInstance().getFile()

##我能用它做什么?

可以使用典型的文件操作,例如遍历文件系统,获取文件内容,重命名,移动或删除. 应使用VfsUtilCore.iterateChildrenRecursively执行递归迭代,以防止由递归符号链接引起的无限循环.

它从何而来?

通过从项目根目录开始上下扫描文件系统,可以逐步构建VFS. VFS _refreshes_检测到文件系统中出现的新文件. 可以使用(VirtualFileManager.getInstance().refresh()VirtualFile.refresh()以编程方式启动刷新操作. 每当文件系统观察者收到文件系统更改通知时(Windows和Mac操作系统上都可用),也会触发VFS刷新.

作为插件开发人员,如果需要访问刚通过IntelliJ Platform API由外部工具创建的文件,则可能需要调用VFS刷新.

##虚拟文件持续多长时间?

在IDEA流程的整个生命周期中,磁盘上的特定文件由相同的VirtualFile实例表示. 可能存在与同一文件相对应的多个实例,并且它们可以被垃圾收集. 该文件是一个UserDataHolder,用户数据在这些相等的实例之间共享. 如果删除了一个文件,其对应的VirtualFile实例将变为无效(isValid()方法返回false,操作导致异常).

##如何创建虚拟文件?

通常你没有. 通常,文件是通过PSI API或通过常规java.io.File API创建的.

如果确实需要通过VFS创建文件,可以使用VirtualFile.createChildData()方法创建VirtualFile实例,使用VirtualFile.setBinaryContent()方法将一些数据写入文件.

##如何在VFS更改时收到通知?

Virtual FileManager.addVirtual File Listener()方法允许您接收有关VFS中所有更改的通知.

##是否有用于分析和操作虚拟文件的实用程序?

VfsUtilVfsUtilCore提供用于分析虚拟文件系统中的文件的实用程序方法.

您可以使用ProjectLocator查找包含给定虚拟文件的项目.

##如何扩展VFS?

要提供备用文件系统实现(例如,FTP文件系统),请实现VirtualFileSystem类( 您很可能还需要实现VirtualFile),并将您的实现注册为应用程序组件.

要挂钩在本地文件系统中执行的操作(例如,如果您正在开发需要自定义重命名/移动处理的版本控制系统集成),请实现LocalFileOperationsHandler接口并通过LocalFileSystem.registerAuxiliaryFileOperationsHandler方法注册它.

##使用VFS有哪些规则?

有关VFS体系结构和使用指南的详细说明,请参阅IntelliJ平台虚拟文件系统.

Last modified: 9 May 2019