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中所有更改的通知.
是否有用于分析和操作虚拟文件的实用程序?
VfsUtil
和VfsUtilCore
提供用于分析虚拟文件系统中的文件的实用程序方法.
您可以使用ProjectLocator
查找包含给定虚拟文件的项目.
如何扩展VFS?
要提供备用文件系统实现(例如,FTP文件系统),请实现VirtualFileSystem类(
您很可能还需要实现VirtualFile
),并将您的实现注册为应用程序组件.
要挂钩在本地文件系统中执行的操作(例如,如果您正在开发需要自定义重命名/移动处理的版本控制系统集成),请实现LocalFileOperationsHandler接口并通过LocalFileSystem.registerAuxiliaryFileOperationsHandler
方法注册它.
使用VFS有哪些规则?
有关VFS体系结构和使用指南的详细说明,请参阅IntelliJ平台虚拟文件系统.