安夜了呀,圣诞节就是明天了,谨以此文献给所有辛苦的IT专业人士们,虽然是份技术型小礼物,也希望你们圣诞快乐哈~

笔者到了年底也特别地事情多,因此请大家继续关注吧,过了年底还有更多精彩技术文章。今天我就写完这篇文章再上街过平安夜吧~!

 

好了,现在切入正题:文件夹的视图信息存在哪儿了?

这是我前几天拿到的一个case。相信大家对文件夹视图不陌生了吧?在 Windows 7 中,默认的文件夹视图大多是"详细信息",就像这样:

alt

而对于您存放有大量图像或者音乐、视频的文件夹,Windows 7 就会自动帮您切换到"大图标"视图,就像是这样:

alt

当然,您也可以通过文件夹属性设置视图或者通过进入文件夹后更改视图。

 

前几天我一个细心的朋友,欧阳,他发现这样一个现象:新建一个文件夹,例如test,在里面随便存一些文本文件,然后为该文件夹指定一个特别的非默认的视图,例如"图片"(或者"大图标"),然后彻底删除该文件夹,接下来以相同的名字"test"在相同位置重建一个新文件夹,你会发现里面的视图还是刚才指定的那种自定义视图。您可以手动实践一下,做做这个实验,呵呵。

 

这究竟是为什么呢?很显然,系统也许保存了这个文件夹对应的自定义试图设置,可是设置究竟保存在何处呢?我们需要借助 Mark Russinovich 大牛写的 Process Monitor 这个工具来监视系统在上述步骤中进行的一切文件操作过程就知道了。这个工具相信您并不陌生,它就是3Q之战中"3"公司制作的什么"XX保护器"的"灵感来源",不多解释了,你一定懂的!!!

 

下面我们来看看如何进行这个动手实验:

1. 在硬盘中找个位置,新建一个文件夹,本例中,我们起名为"testfolder",然后在其中新建一个txt文本文件,您可以发现,这是默认的"详细信息视图";

alt

 

2. 启动ProcMon,为啥要在这时候启动呢?现在启动,我们稍后在改变文件夹视图时就能捕获到设置存放的位置等信息,如果您过早启动ProcMon,由于它记录的信息非常之多,稍后可能更加不方便筛选出有效的信息。所以,建议您在此步骤启动,在启动它之后,先点击工具栏的放大镜按钮,让它出现一个红叉,停止记录,然后点击它右边的第二个按钮清空当前所有记录:alt

 

3. 准备好更改视图,例如,如果您要通过该文件夹属性的自定义选项卡更改视图为"图片",那就先右击该文件夹,选择属性,切换到"自定义"选项卡,如果您要通过资源管理器工具栏右边问号按钮左边的第二个按钮更改视图为"大图标",那您就进入到刚刚创建的testfolder。

 

4. 切换到 ProcMon,再次点击放大镜按钮,让它上面的叉叉消失,即开始记录,然后赶紧去更改文件夹试图,更改完后,又立即切回 ProcMon 再次单击放大镜按钮停止记录;(注意,如果您是通过资源管理器的视图滑竿更改视图的话,更改完后一定记得返回上一层文件夹,只有这样视图信息才被保存)

 

5. 开始在 ProcMon 里面对捕获到的信息进行分析。

 

在这里,我先插播一下如何在 ProcMon 里面进行筛选分析。其实很简单,点击 ProcMon 工具栏的漏斗状按钮,或者点击Filter下拉菜单再选择"filter…"即可弹出筛选器对话框:

alt

我们可以看到,最上面一排有四个下拉菜单字段,分别是"筛选条件类型"、"匹配法则"、"匹配字"、"筛选方法"。筛选方法一般不要动,就选择"include",也就是说把符合前面的条件的内容显示出来,而将无关信息隐藏的意思。那么前三种如何设置呢?我们结合本实验进行具体说明:

 

1. 由于是资源管理器操作的,所以先添加一个筛选条件,将 explorer.exe 进程的操作全部筛选出来,那就应该是"进程名(Process Name)""是(is)""explorer.exe":(输入一个筛选条件后,记得点击"Add"添加)

alt

 

2. 由于我们的视图保存操作一般是将信息保存在注册表,而且是跟shell有关,所以我们相信注册表的分支里面一定包含shell字样,所以我们设置下一个筛选条件"路径(Path)""包含(contains)""shell":

alt

 

3. 最后,我们这个实验是创建新文件夹,并且首次指定自定义视图,因此系统应该是创建了一个新的注册表键值,因此,我们最后添加条件"操作(Operation)""包含(contains)""创建(create)":

alt

 

4. 制定好筛选规则并添加后,我们最后点击对话框底部的OK按钮应该用筛选,好了,现在就明显地看见结果了:

alt

 

从结果中我们可以看出,跟这个有关的父键是HKCU\Software\Classes\Local Settings\Software\Microsoft\Windows\Shell\BagMRU,而实际保存视图的键值为HKCU\Software\Classes\Local Settings\Software\Microsoft\Windows\Shell\BagMRU\0\3\56。因为 ProcMon 是跟随时间记录的,所以从上往下看,筛出来的注册表历经越来越深,最深的那个应该就是保存视图的位置了,您可以右击该条目,选择"跳转到(Jump To…)"开打开注册表中的该位置,看看里面有什么信息。如果您不相信,可以做个验证,就是先备份该键值,然后删除它,看看是不是视图信息丢失了呢?(注意,需要重启explorer进程)

 

嘿嘿,其实这个case可以分析的更深入的,因为对应这个文件夹的具体视图保存处并不是按照GUID分类的,那么系统是如何将这个保存位置(Shell\BagMRU\0\3\56)与文件夹(G:\testfolder)对应起来的呢?(即寻求文件夹视图信息保存的机制结构)还有,键值与各视图的对应关系如何呢?这里只是提供两个更深的疑问,有兴趣的同志们可以继续去做实验求证,在这里我不再公布结果了,笔者告诉您,动动脑筋把实验做下去,你是一定可以得到答案的~嘿嘿。

 

然后还要做一点说明,就是希望大家动手做实验,这样才能够真正地保证各位能够掌握工具的使用、掌握排错思路。我在此承诺,只要是您根据上面的步骤做实验,遇到任何问题请留言,我是一定会解答的。以后包含实验的文章都是这样,每篇文章最后的留言专门解答该文章中的实验的疑问。

 

为了使实验步骤连贯、让您从大体上有个了解,我省去了很多解释,在这里最后需要做几点说明:

1. 思路是本实验步骤之外的重中之重,为什么要一次加上上面那三个筛选条件才能筛出正确的结果呢?这就是排错的思路。因为,我们知道这个操作是在资源管理器进行的,因此,肯定是先尝试筛选出 explorer 进程。如果您不知道该操作有关的设置是保存在注册表的,您也可以先根据首次的配置是需要创建配置文件的理解,按照筛选"创建(create)"操作先去筛选,不满意再想办法进一步筛选的。是您的思路在不断组合,才能尝试筛选出正确的结果,所以需要多实践。就算您按照上面的最优步骤进行实验,也强烈建议您每添加一个filter以后,先点击OK按钮看看即时的结果,然后再去添加下一个filter,再OK去看即时结果,直到得到正确结果,而且您还可以一个一个删除filter来倒回来,这样能够让您更好地理解为什么要这么筛选;

2. 对于各种案例的 ProcMon 分析,是需要一定的系统知识背景的,例如最简单的,与分用户配置有关的问题,那如果涉及到注册表,您肯定是应该去筛选HKCU了,本例也是一样,你得知道文件夹部分设置一般还保存在注册表(旧有的_desktop.ini也行),才能少走弯路;

3. ProcMon 的其他筛选条件的使用,请自己摸索,您可以查看帮助文档,其实不查看帮助,随便搜集一些结果,然后尝试一下,您也会懂的。学习工具的使用,最好的途径就是摸索和实践;

4. 对于生活中的大大小小的案例,按照思路也不一定能够筛出正确结果,这就需要查阅一些知识库,了解更多背景知识,并且做更多筛选尝试,有时候,在不确定时还真得浏览上百条初筛的信息,肉眼寻求正确结果,再反向推导对于这类问题应该加何种筛选条件。

 

嗨,一激动说了太多,不过终于写完了,可以上街吃饭了~呵呵

最后祝所有IT专业人士都能够越来越有经验,在职业发展的道路上更上一层楼!祝愿大家圣诞快乐,平安夜快乐平安!也提前祝大家元旦快乐!!!

 

中国十大杰出IT博客评选,最后七天!记得发动您的亲朋好友帮我进行最后一波的投票吧,http://2010blog.51cto.com/1101031,麻烦大家每天都帮我投票吧,坚持到31日~多谢!每台计算机每天只能投一票哦~千万别违规,坚持每天投~~感谢!