为什么matchInDirectory应该返回挂载点

时间:2016-08-12 09:18:52

标签: tcl

我正在实现Tcl Filesystem对象。有人可以解释什么是挂载点。为什么需要它们。如果我的matchInDirectoryProc不会像原生文件系统实现那样返回任何挂载点会发生什么呢?

假设有foo / bar / vfs.myzip,其中vfs.myzip是我正在实现文件系统的容器文件。我假设vfs.myzip是一个挂载点。如果type为TCL_GLOB_TYPE_MOUNT,我的实现应该返回foo / bar / vfs.myzip,path是foo / bar /,patter是“*”。如果啪啪声是“* / *”怎么办?

1 个答案:

答案 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的条目。如果这是您维护的唯一安装点,那么在这种情况下您唯一需要处理的是。

无论如何,假设我是正确的。我不太了解虚拟文件系统层,所以这是基于阅读代码和文档,而不是真正的经验...