利用托管代码操作库
在上文中,我们介绍了如何利用Shell API在非托管代码中对库进行操作。那么对于托管代码,该如何处理呢?不用担心,微软早为我们提供了相应的解决方案。在Microsoft Windows API Code Pack中,微软封装了很多Native API以提供给.NET程序使用。利用这个程序集,我们可以方便地利用其中封装的各种对象,实现各种本地API功能,使用起来甚至比直接使用API还方便简单。在这里,我们只对跟库相关的对象感兴趣。在Windows API Code Pack中的ShellLibrary对象封装了所有对库的操作,在托管代码中,我们只需要这个对象就可以对库进行操作了。
为了演示托管代码对库的操作,我们创建一个Visual C#控制台应用程序,然后在项目中添加对Microsoft.WindowsApiCodePack.dll和Microsoft.WindowsApiCodePack.shell.dll的引用。现在,我们就可以使用ShellLibrary对象对库进行各种操作了:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
// 使用ShellLibrary所在的名字空间
using Microsoft.WindowsAPICodePack.Shell;
namespace LibraryDemoCS
{
class Program
{
static void Main(string[] args)
{
// 定义库的名字和文件夹路径
string strLibName = "MyLib";
string strFolderPath = @"C:\";
// 创建库并添加文件夹
using (ShellLibrary library =new ShellLibrary( strLibName, true))
{
library.Add(strFolderPath);
}
// 加载已经存在的库对对其进行操作
using (ShellLibrary lib = ShellLibrary.Load("MyLib", false))
{
// 添加新的文件夹
lib.Add(@"D:\");
// 设置属性
lib.IsPinnedToNavigationPane = true;
string strDefSaveFolder = @"D:\";
// 设置默认的保存文件夹
lib.DefaultSaveFolder = strDefSaveFolder;
// 循环遍历库中的文件夹
// 找到并显示默认保存文件夹
foreach (ShellFolder folder in lib)
{
Console.WriteLine("\t\t{0} {1}",
folder.Name,
strDefSaveFolder == folder.ParsingName ? "DefSaveFolder" : "");
}
}
Console.Read();
}
}
}
using System.Collections.Generic;
using System.Linq;
using System.Text;
// 使用ShellLibrary所在的名字空间
using Microsoft.WindowsAPICodePack.Shell;
namespace LibraryDemoCS
{
class Program
{
static void Main(string[] args)
{
// 定义库的名字和文件夹路径
string strLibName = "MyLib";
string strFolderPath = @"C:\";
// 创建库并添加文件夹
using (ShellLibrary library =new ShellLibrary( strLibName, true))
{
library.Add(strFolderPath);
}
// 加载已经存在的库对对其进行操作
using (ShellLibrary lib = ShellLibrary.Load("MyLib", false))
{
// 添加新的文件夹
lib.Add(@"D:\");
// 设置属性
lib.IsPinnedToNavigationPane = true;
string strDefSaveFolder = @"D:\";
// 设置默认的保存文件夹
lib.DefaultSaveFolder = strDefSaveFolder;
// 循环遍历库中的文件夹
// 找到并显示默认保存文件夹
foreach (ShellFolder folder in lib)
{
Console.WriteLine("\t\t{0} {1}",
folder.Name,
strDefSaveFolder == folder.ParsingName ? "DefSaveFolder" : "");
}
}
Console.Read();
}
}
}
在这段代码中,我们简单地利用Windows API Code Pack中的ShellLibrary对象对库进行了操作,实现了库的创建,文件夹的添加,库的各种属性的设置和库所管理的文件夹的遍历等等。我们可以看到,实际上利用托管代码操作库,比非托管代码更加方便和简单。