如何实现在IE8中自动导入搜狗浏览器的收藏夹

摘要:一直以来,将收藏夹从搜狗浏览器导入到IE中是很让人头疼的事情,因为搜狗浏览器的收藏夹并不是像IE那样以.url文件和目录的方式来组织,而且前者也并未提供这两种格式转换的工具——搜狗浏览器中竟只能将收藏夹导出成xml文件?!(简直就是流氓行为!)这让想要多种浏览器共享收藏夹的朋友只能是望洋兴叹了~。目前,在网上也流传了将这个xml文件导成IE收藏夹格式的程序,但小鑫认为这样解决这个问题并不究竟——每次同步收藏夹还都要先用搜狐浏览器的工具将收藏夹导出成xml文件!太麻烦了!小鑫可容忍不了这种事情!经过仔细研究,小鑫发现搜狐浏览器的收藏夹原来是存储在一个Favorite.dat文件中,而这个文件竟然是个SQLite数据库!(搜狐也太狡猾了!)而所有的收藏夹信息全部以表记录的方式存储在这个数据库中。最后小鑫用了一晚上的时间终于开发出了能够真正全自动完成搜狗浏览器收藏夹导入IE的程序——小鑫仅需要点击IE8工具栏上的一个按钮就可以实现这种收藏夹的同步,而无需其它任何多余的操作!下面,小鑫就借这篇博文来和大家分享这份喜悦。

正文:

       小鑫一直使用搜狗浏览器,可在IE8出现后,小鑫便觉得IE8的显示效果视乎要比前者要好些——相同网页显示的字体IE8要比搜狗的清晰许多(不过不知道是不是搜狐浏览器里哪可以设置这个,如果有哪位朋友知道请教小鑫,小鑫将万分感谢!),所以小鑫便决定将弃搜狐用IE8。这就便是小鑫开发这个收藏夹同步程序的缘起了,呵呵。

       经过小鑫研究发现,搜狐浏览器的收藏夹信息全部存储在文件Favorite2.dat中,而这个文件在不同版本的windows操作系统中的存储目录不同:在Windows 7中Favorite2.dat存储在目录%userprofile%\AppData\Roaming\SogouExplorer\下(不知道Vista是不是这样,小鑫没用过Vista);在Windows NT 5(Window2003、Windows Xp、Windows 2000 系列)中则存储在目录%userprofile%\Application Data\SogouExplorer\下。而Favorite2.dat文件实则是个SQLite数据库(SQLite数据库是个文件型的开源数据库,据说其最大可支持4TB的数据,小鑫会在以后博文中来详细介绍这个数据库),而对这个数据库的访问可以使用开源项目System.Data.SQLite中提供基于ADO.NET2.0构建的data provider。下图是安装了System.Data.SQLite后在VS2010的Server Explorer通过Data Connection 来查看Favorite2.dat中收藏夹信息的截图:

image_thumb[17]

搜狐浏览器的收藏夹信息就存储在表favorTable中,该表的表结构如下:

image_thumb[16]

在该表中同时存储了收藏夹的目录结构和url信息,其中:

1、目录和url通过字段folder来区分,1表示目录,0表示url;

2、pid表示该目录(或url)所属的上级目录,如果pid值为0,则表示该节点没有父目录;

3、title的值表示目录或url的显示名称;

4、url则为指向的链接,对于目录该字段的值为空。

明确了以上信息,我们就可以在程序中通过System.Data.SQLite中提供的类似于ADO.NET2.0的语法的一组对象模型来访问Favorite2.dat中的这些记录,代码如下:

 

class Sogou2IEFavorite
{
private int foldernum = 0;

private int urlnum = 0;

public void ExecuteTransfer()
{
string userprofileDir = Environment.GetEnvironmentVariable("USERPROFILE");//获取%userprofile%环境变量的值
string sogouExpDir = @"SogouExplorer\Favorite2.dat";//搜狐收藏夹文件相对路径
string appDir = string.Empty;

#region 根据操作系统判断搜狐收藏夹文件的存放位置
OperatingSystem os
= Environment.OSVersion;
if (os.Version.Major > 5)//Windows NT 5.0系列以上操作系统
{
appDir
= @"AppData\Roaming";
}
if (os.Version.Major == 5)//windows 2000,windows 2003, windows xp
{
appDir
= @"Application Data";
}

if (appDir == string.Empty)
{
MessageBox.Show(
"该程序不支持当前操作系统!");
return;
}
#endregion

RegistryKey root;
RegistryKey rk;
root
= Registry.CurrentUser;
rk
= root.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\User Shell Folders", true);
string favoritesPath = rk.GetValue("Favorites").ToString();//获取IE收藏夹路径
rk.Close();
root.Close();

SQLiteConnection cnn
= new SQLiteConnection();

cnn.ConnectionString
= " Data Source=" + userprofileDir + "\\" + appDir + "\\" + sogouExpDir;
cnn.Open();

//通过迭代的方式来遍历搜狐浏览器收藏夹目录树
workthroughSubNodeSqlLite(0, favoritesPath, cnn);
MessageBox.Show(
string.Format("导出成功!\r\n共导出:目录{0}个,网址{1}个", foldernum, urlnum), "提示", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1);

}

void workthroughSubNodeSqlLite(int pid, string currentdir, SQLiteConnection cnn)
{
SQLiteCommand cmd
= new SQLiteCommand();
cmd.Connection
= cnn;
cmd.CommandText
= "select id,folder,title,url from favorTable where pid=" + pid;
SQLiteDataReader datareader
= cmd.ExecuteReader();
while (datareader.Read())
{
int id = datareader.GetInt32(0);
//string name = datareader.GetString(1);
int folder = datareader.GetInt32(1);
string title = datareader.GetString(2);
//string url = datareader.GetString(3);
if (folder == 1)
{
foldernum
++;
Directory.CreateDirectory(currentdir
+ "\\" + title);
workthroughSubNodeSqlLite(id, currentdir
+ "\\" + title, cnn);
}
else
{
urlnum
++;
char[] invalidfileNameChars = System.IO.Path.GetInvalidFileNameChars();
if (title.IndexOfAny(invalidfileNameChars) >= 0)
{
foreach (char c in System.IO.Path.GetInvalidFileNameChars())
{
title
= title.Replace(c, '_');
}
}
string filepath = currentdir + "\\" + title + ".url";
if (File.Exists(filepath))
{
File.Delete(filepath);
}

string url = datareader.GetString(3);
StringBuilder sb
= new StringBuilder();
sb.Append(
"[DEFAULT]\r\n");
sb.Append(
"BASEURL=");
sb.Append(url);
sb.Append(
"\r\n");
sb.Append(
"[InternetShortcut]\r\n");
sb.Append(
"URL=");
sb.Append(url);
sb.Append(
"\r\n");
File.AppendAllText(filepath, sb.ToString());
}
}
}

}

 

 

      以上这段代码的入口函数是ExecuteTransfer,它调用了函数workthroughSubNodeSqlLite。在这以上这两个函数中主要完成了三件事情:

1、根据当前操作系统版本获取Favorite2.dat文件的存储路径;

2、获取当前用户IE收藏夹路径;

2、通过迭代的方式来遍历搜狐浏览器收藏夹目录树,并同时将结果导入到IE收藏夹中。

     至此这个收藏夹同步程序的主体代码已经介绍完毕,下面便是要将这个程序注册到IE8的工具栏中,其中具体的注册方法见小鑫的另一篇博文《如何在IE8工具栏上注册自定义工具》。

     这个程序小鑫已经做好了安装包,安装后在IE的自定义工具栏中即可找到这个小工具。并且该程序分别在windows 7和Windows 2003,并在IE6~8版本下均通过测试,其它版本操作系统如果也能使用请大家能够留言告诉小鑫,小鑫将感激涕零。

    下载地址

     由于本程序使用VS2010开发,所以工程就不提供下载了,有需要的朋友可以留言把email告诉小鑫,小鑫将打包发给您。
     最后向大家秀秀下功能效果图^_^:

image_thumb[30]

收藏夹同步工具已被注册到了IE8的工具上,同时IE的收藏夹为空

image_thumb[28]

收藏夹导入完毕

posted @ 2010-04-18 01:38  乐水鱼  阅读(5647)  评论(7编辑  收藏  举报