我正在实现Tcl Filesystem对象。有人可以解释什么是挂载点。为什么需要它们。如果我的matchInDirectoryProc不会像原生文件系统实现那样返回任何挂载点会发生什么呢?
假设有foo / bar / vfs.myzip,其中vfs.myzip是我正在实现文件系统的容器文件。我假设vfs.myzip是一个挂载点。如果type为TCL_GLOB_TYPE_MOUNT,我的实现应该返回foo / bar / vfs.myzip,path是foo / bar /,patter是“*”。如果啪啪声是“* / *”怎么办?
答案 0 :(得分:2)
安装点是特定虚拟文件系统的根路径的前缀(本机文件系统是特殊的,IIRC)。 VFS中的所有内容都将显示在该安装点下方。
因此,假设/foo/bar/vfs.myzip
是挂载点,VFS内部是文件abc.txt
,目录def
和另一个文件def/ghi.html
。在这种情况下,一旦正确安装,将存在以下内容:
/foo/bar/vfs.myzip/abc.txt
/foo/bar/vfs.myzip/def
/foo/bar/vfs.myzip/def/ghi.html
现在,matchInDirectoryProc
在globbing代码中使用。其目的是返回与特定(虚拟)目录中的特定约束集匹配的目录条目列表。它包含在Tcl API函数Tcl_FSMatchInDirectory
中,其文档指出:
请注意, glob 代码在内部实现递归模式,因此此函数只会传递简单模式,可以使用字符串匹配的逻辑进行匹配。为了处理递归,Tcl将经常调用此函数,只询问要返回的目录。使用
NULL
模式调用的特殊情况表示只需要检查路径是否正确。
也就是说,不要担心*/*
模式;你永远不会看到它。
我不是完全确定搜索挂载是如何工作的,但我认为它确定是否存在与路径匹配的特定VFS处理的挂载。我可以在网上找到这个的主要例子是TclVFS包,这在某些方面相当奇怪。 Here's the relevant code但我认为这并不容易理解。但是对于所有这些, 的一件事是相对清楚的:它询问特定目录中的挂载,而不是递归。
因此,如果您的挂载点是/foo/bar/vfs.myzip
,那么当您调用代码询问{{1}}中的挂载点时,它应该返回/foo/bar
的条目。如果这是您维护的唯一安装点,那么在这种情况下您唯一需要处理的是。
无论如何,假设我是正确的。我不太了解虚拟文件系统层,所以这是基于阅读代码和文档,而不是真正的经验...