一直想实现一个小的功能就是把自己的收藏夹的地址自动生成网页形式,这样便于管理,也可以设置成自己的首页,变为自己的导航站点,不必每次都去点收藏夹了,哈哈!
要用到的知识有注册表的读取,文件,文件夹的相关操作。
1 收藏夹存在于注册表中
HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/Explorer/Shell Folders
"Favorites"="C:/Documents and Settings/Administrator/Favorites"
2 Favorites文件夹位置,每一个收藏的内容都类似于
[DEFAULT]
BASEURL=http://dotnet.aspx.cc/
[InternetShortcut]
URL=http://dotnet.aspx.cc/
Modified=30C9E4C9C908C5013D
IconFile=http://dotnet.aspx.cc/Images/favicon.ico
IconIndex=1
2.1.它们是internet快捷方式,扩展名为url;
2.2.每个url的内容都是纯文本格式的,可以在cmd模式下用命令“type aaa.url”来查看;
2.3.ulr文件实际上跟以前使用的ini配置文件一样,由节(section)和键(key)组成,楼主需要的地址在节[InternetShortCut]中的键
URL里面保存;
2.4.如果要用程序获取地址,可以以文本方式打开url文件,依次读取每一行,然后判断该行的最初4个字母是否为“URL=”,如果是,则读
取该行余下的所有文本。
3 C#读取注册表信息
注册表是视窗系统的一个核心的数据库,在这个数据库中存放中与系统相关的各种参数,这些参数直接控制中系统的启动、硬件的驱动程序
安装信息以及在视窗系统上运行的各种应用程序的注册信息等。这就意味着,如果注册表因为某些原因受到了破坏,轻者是视窗系统启动过程
出现异常,重者就有可能导致整个系统的完全瘫痪。所以正确的认识注册表,及时的备份注册表,对于视窗用户就显得相当重要。
C#就可以十分方便、简洁的开发出操作注册表的程序。单击"开始/运行",在"打开"的后面填入"regedit"。就可以看到注册表的数据结构
了。"主键"是有层次结构的。主键的下一级主键称为该主键的"子键"。每一个主键可以对拥有多个子键。右边的这些值就是所谓的键值了。每
一个主键或者子键都可以拥有多个键值。注册表是一个庞大的数据库,在其中每一个主键,每一个键值都赋予了不同的功能。
C#如何读取注册表中的主键和键值:在.Net FrameWork SDK Beta 2版中,有一个Microsoft.Win32的名称空间,在此名称空间中提供了二
个用于注册表操作的类:Registry类、RegistryKey类。这二个类都是封闭类,不可以继承。这二个类定义了许多关于注册表的方法和属性,通
过调用这二个类,在Visual C#中就可以比较轻松的处理关于注册表的各种操作了。
(1).Registry类:此类主要封装了七个公有的静态域,而这些静态域分别代表这视窗注册表中的七个基本的主键,具体如下所示:
Registry.ClassesRoot 对应于HKEY_CLASSES_ROOT主键
Registry.CurrentUser 对应于HKEY_CURRENT_USER主键 //我们要用到这个
Registry.LocalMachine 对应于 HKEY_LOCAL_MACHINE主键
Registry.User 对应于 HKEY_USER主键
Registry.CurrentConfig 对应于HEKY_CURRENT_CONFIG主键
Registry.DynDa 对应于HKEY_DYN_DATA主键
Registry.PerformanceData 对应于HKEY_PERFORMANCE_DATA主键
(2).RegistryKey类:此类中主要封装了对视窗系统注册表的基本操作。在程序设计中,首先通过Registry类找到注册表中的基本主键,
然后通过RegistryKey类,来找其下面的子键和处理具体的操作的。
在运行程序前的一些必要的处理工作。在程序设计时,主要功能是读取已经存在的主键键值,用户可以新建若干个主键和对应的键值。
程序的主要功能是读取指定主键下面的所有子键和子键拥有的键值,并以列表的形式按层次显示出来。
程序中读取主键、子键和键值所使用到的方法: 程序中为了读取指定主键下面的子键和子键中拥有的键值,主要使用了RegistryKey类中
的四个方法:OpenSubKey,GetSubKeyNames,GetValueNames,GetValue。具体的用法和意思如下:
OpenSubKey ( string name )方法主要是打开指定的子键。
GetSubKeyNames ( )方法是获得主键下面的所有子键的名称,它的返回值是一个字符串数组。
GetValueNames ( )方法是获得当前子键中的所有的键名称,它的返回值也是一个字符串数组。
GetValue ( string name )方法是指定键的键值。
4 关于文件的
Directory.GetDirectories() 得到文件目录的下一级目录;
Directory.exits() 是否存在这个目录
方法的意思和file差不多。
读取文本的话使用streamreader.readline()得到想要得到的url地址
程序代码如下
using System;
using System.IO;
using Microsoft.Win32;
using System.Collections;
namespace Cdccis.Cdt.Swort
{
/// <summary>
/// 读取收藏夹中的URL
/// </summary>
public class Favorite
{
public Favorite()
{
//
// TODO: 在此处添加构造函数逻辑
//
GetFavoriteValue();
}
private string address = string.Empty;
public ArrayList alTitle = new ArrayList();
public ArrayList alUrl = new ArrayList();
/// <summary>
/// 获取收藏夹的位置
/// </summary>
/// <returns>收藏夹的绝对位置</returns>
public void GetFavoriteValue()
{
RegistryKey rk = Registry.CurrentUser;
RegistryKey softWare= rk.OpenSubKey("Software");
RegistryKey microsoft = softWare.OpenSubKey("Microsoft");
RegistryKey windows = microsoft.OpenSubKey("Windows");
RegistryKey current = windows.OpenSubKey("CurrentVersion");
RegistryKey explorer = current.OpenSubKey("Explorer");
RegistryKey shell = explorer.OpenSubKey(@"Shell Folders");
address = (string)shell.GetValue("Favorites");
HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/Explorer/Shell Folders
"Favorites"="C:/Documents and Settings/Administrator/Favorites"
}
/// <summary>
/// 读取收藏夹中的文件
/// </summary>
public void ReadFavorite()
{
//得到所有的目录
string[] directory = Directory.GetDirectories(address);
//循环目录中的每一个URL快捷方式
//读取得到文件名和链接地址 存储到一个可以动态变化的数组中arraylist
foreach(string d in directory)
{
if(Directory.Exists(d))
{
string[] files = Directory.GetFiles(d);
//读取 并且进行存储
foreach (string f in files)
{
if (File.Exists(f))
{
GetTitleAndUrl(f);//得到文件名和链接地址
}
}
}
}
//得到 根目录下所有的 url文件
string[] filesnew= Directory.GetFiles(address);
//读取 并且进行存储
foreach (string f in filesnew)
{
if (File.Exists(f))
{
GetTitleAndUrl(f);//得到文件名和链接地址
}
}
}
/// <summary>
/// 得到快捷方式的标题,就是文件的标题和链接地址
///
/// </summary>
/// <returns></returns>
public void GetTitleAndUrl(string addr)
{
try
{ //排除ini文件的干扰
if (addr.Substring(addr.LastIndexOf(".")+1)!="ini")
{
using (StreamReader sr = new StreamReader(addr))
{
//截取后缀名和前面的不需要的东西
int fnum = addr.LastIndexOf(@"/") + 1;
int length = addr.Length - fnum - 4;
string title = addr.Substring(fnum,length);//第2个参数是长度,不是结束位置的数字,害我调试了半天!
alTitle.Add(title);
string line = "";
while ((line = sr.ReadLine()) == "[InternetShortcut]")
{
string url = sr.ReadLine();// url="URL=http://dotnet.aspx.cc/ "
url = url.Substring(4);
alUrl.Add(url);
}
}
}
}
catch (Exception ex)
{
throw;
}
finally
{
}
}
}
}
aspx的前台代码如下
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>无标题页</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<table>
<asp:Literal ID="lt_Hyplink" runat="server"></asp:Literal></table>
</div>
</form>
</body>
</html>
aspx的后台代码如下
using System;
using System.Configuration;
using System.Data;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using Cdccis.Cdt.Swort;
using System.Collections;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
Favorite fav = new Favorite();
fav.ReadFavorite();
string content = "";
for (int i = 0; i < fav.alTitle.Count; i++)
{
content += "<tr><td bgcolor='#989802' align='left'> <a href='" + fav.alUrl[i].ToString()+ "' target='blank'>";
content += fav.alTitle[i].ToString() + "</a></td></tr>/r/n";
}
lt_Hyplink.Text = content;
}
}
输出截图如下
其实还可以改进 把相关的网页进行分类显示出来。