技术开发 频道

VS与Windows 7共舞:库(Library)

  【IT168 专稿】“小陈,再把你的项目策划书给我发一份!你昨天发给我的我找不到了!我记得保存在C:\Users\Win7\Documents\Office 2010\项目策划书\陈良乔\草稿\这个目录下了啊,怎么找不到了?难道是在D盘的D:\文档\W7项目\项目文档\策划书\陈良乔\草稿\下?”

  “喂喂喂,QQ客服吗?我找不到QQ接收的文件了啊,刚刚好友发给我的文件在哪里啊?”

  “老婆,我们去年去重庆旅游时照的照片在哪里啊?我怎么找不到了?”

  ——计算机里面的文件越来越多,我们置身于茫茫的文件海洋,该怎么办?

  为什么要引入库(Library)的概念

  在以往的Windows操作系统中,我们总是以树状结构的方式来组织和管理我们计算机上的各种文件和文件夹。我们往往根据文件的内容或者类型将他们分别保存在不同的目录下,从而一层一层嵌套形成树状结构。但是随着硬盘容量越来越大,计算机上的文件数量越来越多,同时由于树状结构的先天缺陷,这种组织文件的方式开始变得无法满足我们日常的需要了。单一的一种树状结构的分类方式,无法满足文件之间复杂的联系。比如,当你在准备一份计划书的时候,你将文档保存在文档相关的目录下,同时,你将文档中的各种插图保存在图片相关的目录下,在这种情况下,当你要查看修改文档中的某张图片时,你需要在文档目录图片目录之间跳转切换,为我们的工作带来很多不便。又比如,你是一位高清电影爱好者,收藏了很多电影,这些电影分别按照树状结构分类存放在你的硬盘上的各个分区,如果现在你想找到某部电影,就需要在各个分区,各个目录之间查找,费时费力。

  为了帮助用户更加有效的对硬盘上的无数文件进行更加有效的管理,微软在Windows 7中提供了新的文件管理方式:库(Library)。作为访问用户数据的首要入口,库在Windows 7里是用户指定的特定内容集合,和文件夹管理方式是相互独立的,分散在硬盘上不同物理位置的数据可以逻辑地集合在一起,查看和使用都更方便。引入了库的概念后,我们就可以将这两个相关的文件夹组织到同一个库下,比如我可以将我的所有视频整理到视频库中,这样我们在查找电影时就方便多了,只需要在视频库中进行查找,就可以很快地找到相关的内容了,虽然这些文件保存在不同的硬盘位置,不同的文件夹下。


图1 Windows 7中的库

  本质上,库的概念的引入,不是来解决文件的分类问题的,这个问题在文件夹时代已经解决了,库解决的是分类方式不唯一的问题。还是上面视频库的例子,一部电影,我们可以按照风格分类,也可以按照演员分类,还可以按照产地分类,如果是文件夹的方式,这部电影我到底该放在哪个文件夹下呢?库的诞生,才能使分类真正做到严格。对于计算机中的各种资源,往往是有很多种分类方式,同时各种资源之间又有复杂的关联关系,在特定的应用环境中,采用特定的分类方式才能获得最好的工作效率。而库可以对分类方式进行完全的自定义,一个库基本上就代表了一种分类方式,可以满足人们对文件进行复杂分类的需求。

  Windows 7中的库

  在Windows 7的资源管理器中,内置添加了对库的支持。默认情况下,资源管理器已经包含了文档,音乐,图片和视频这几个常用的库。


图2  Windows 7内置的库

  当然,我们可以根据自己的需要对库进行管理,创建新的库,或者是添加、删除库所管理的文件夹等等。


图3  对库进行管理

  同时在Windows 7所提供的通用文件对话框中,也添加了对库的支持。通过通用文件对话框,我们可以从库中选择需要的文件,或者是将文件保存到自定义的库中。所以无论在Windows 7的任何位置,我们都能很方便快捷地访问到库。例如,我们可以通过下面这段代码调用通用保存文件对话框,然后在其中选择库作为文件保存的位置:
 

// 初始化COM
    CoInitialize(
NULL);  
    
//
    IShellItem
*ppsi;
    ppsi
= NULL;
    IFileSaveDialog
*pfod;
            
// 创建通用保存文件对话框
    HRESULT hr
= CoCreateInstance(
        CLSID_FileSaveDialog,
        
NULL,
        CLSCTX_INPROC,
        IID_PPV_ARGS(
&pfod));

    
if (SUCCEEDED(hr))
    {
                        
// 显示对话框
        hr
= pfod->Show(NULL);
        
if (SUCCEEDED(hr))
        {
                                    
// 获得选择的路径
            hr
= pfod->GetResult(&ppsi);
        }

        pfod
->Release();
    }

          
//
          
// 释放COM
        ::CoUninitialize();

  通过这段简单的代码,我们就可以调用系统的通用保存文件对话框,在其中,我们可以访问系统下的所有定义的库,同时可以将这些库作为文件保存的位置。虽然库只是文件的一种组织形式,并不代表某个实际的硬盘位置,但是因为库有默认的保存文件夹,我们还是可以选择库作为文件的保存位置。


图4 在通用文件对话框中访问库

  库的实质

  实质上,Windows 7操作系统中各种库的信息都保存在一个.library-ms文件中。这是一个XML文件,保存在%appdata%\Microsoft\Windows\Libraries 文件夹 (也称为 FOLDERID_Libraries) 下,文件名就是库的名称。这个文件记录了库的各种信息,例如:

  这个XML文件的元素具有很好的自解释性,我们来看看其中几个关键元素的意义:

  • 为这个库指定一个全局唯一的ID。

  • 这是一个布尔值,表示库是否被固定在 Windows 资源管理器左侧的导航窗格。

  • 表示这个库定义文件被修改的次数。

  • 是一个可选的元素,它允许我们指定文件夹的类型 (例如,文档、 图片、 视频等),从而可以控制文件或者文件夹在 Windows 资源管理器中的视图排列方式。

  • 定义库所使用的图标。这里我们可以用标准的 Windows 外壳程序资源样式的图标资源。 例如,我们要指定自定义库使用imageres.dll中的某个图标,可以这样定义:

<iconreference> C:\Windows\system32\imageres.dll,-65 </iconreference>

  这里需要注意的是,用户不能更改默认库的图标。我们可以通过Windows Explorer为库指定图标,也可以以编程的方式修改库的图标。

  了解了库定义文件的格式后,通过编辑这个文件我们就可以修改库的各种属性,从而实现对库的操作和管理。而实际上无论是用户手动地操作库还是通过编程实现,最终操作的都是库定义文件。

  在本文中,我们介绍了库的缘起,库的形式和实质,相信大家看得还不过瘾,作为程序员,都迫切地想知道如何利用编程的方式对库进行操作,如何为自己开发的应用程序添加对库的支持或者是更好地利用库的新特性。这里先买个关子,稍事休息,下文回来!

0
相关文章