包含window文件夹中以点开头的dot文件的文件树结构

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ZJU_fish1996/article/details/89007729

问题背景

        windows的文件结构里有两个特殊的文件,处在文件夹下,一个是..(点点),它指向当前文件夹的父文件夹,另一个是.(点),它指向当前文件夹自身。

        最近处理文件树的结构,为了能够访问每个文件或文件夹所在的父文件夹,最为直接的方法是在树结点中包含一个parent结点,不过稍微有点浪费空间。于是就想到了windows所用的dot文件。

        本文所做的工作就是猜测一下包含dot的文件树数据结构可能是什么样子的。

具体实现

struct fileItem
{
    fileItem* child;
    fileItem* sibling;
    int type; // directory,file,dots
    string filePath;
    string fileName;
};

       使用的文件树数据结构为child-sibling树,是一个二叉树,基本结构如上。对于每个文件夹,会额外包含两个dot结点,也就是..和.。它的基本结构如下图,其中蓝色的线代表child,横着的黑线代表sibiling:

        

        本身结构不难理解,但是画起来看着就有点乱,所以此处用文字描述一下规则:

        (1) 每个文件夹D的孩子结点指向dot(..)结点,dot(..)的孩子指向文件夹D的父文件夹,邻居指向下一个dot(.)结点

        (2) dot(.)结点的孩子指向文件夹D,邻居指向文件夹真正的第一个子文件/文件夹结点

        (3) 每个文件结点的孩子指向dot(.)

         通过以上结构,我们就能快速的访问到每个文件夹/文件的父文件夹,并且对文件和文件夹的调用是统一的,调用方式如下:

fileItem* fileItem::GetParentItem()
{
    return fileItem->child->child;
}

构建

        构建文件树数据结构时,我们每一轮递归仅处理一层文件夹,为了能够在构建每一层时直接知道当前文件夹的父文件夹,可以在每一层构造的时候,先让文件夹的孩子结点指向当前层的dot(.)结点,等到构建该文件夹的下一层时,就能从该文件夹的孩子结点直接取到父文件夹数据,取到之后,再让其指向自己的dot(..)结点。

猜你喜欢

转载自blog.csdn.net/ZJU_fish1996/article/details/89007729