在《用visual c#读取注册信息》的文中,已经介绍了用 visual c#来读取注册表中的注册信息。本文就来介绍用visual c#对注册表的另外一个操作,这也是一个具有破坏性的操作过程--删除注册信息。
在上文中已经知道,由于visual c#本身没有带类库,他对注册表的处理过程是通过调用.net framework sdk中的名称空间microsoft.win32中封装的二个类来实现的。这二个类就是registry类、registrykey类。在 registrykey类中定义了三个方法来删除注册表中的注册信息。他们分别是:deletesubkey ( )方法、deletesubkeytree ( )方法、deletevalue ( )方法。下面就具体介绍一下在visual c#中如何正确使用这三个方法。
一.如何用visual c#中调用这三个方法:
在介绍如何使用这三个方法之前,还需要重新介绍一下registrykey类中的一个方法--opensubkey ( )方法。在上一文中已经介绍了,此方法是打开指定的子键。其实opensubkey( )方法有二种调用的方式:
i > .opensubkey ( string , subkey ) :这种调用方式是对于此子键只是进行读操作。
ii > .opensubkey ( string subkey , boolean writable ):当对子键使用写操作的时候要用此种调用方法。如果在对子键使用了写操作,但仍然使用第一种调用方法,在程序运行的时候会产生一个错误信息。
(1). deletesubkey ( )方法:
此方法是删除一个指定的子键,在使用此方法的时候,如果在此子键中还存在另外的子键,则会产生一个错误信息。在程序中调用此方法有二种原型,为:
i > . deletesubkey ( string , subkey ):这种调用方式就是直接删除指定的子键。
ii > . deletesubkey ( string subkey , boolean info ):其中的"string"是要删除的子键的名称,"boolean"参数的意思是:如果值为"true",则在程序调用的时候,删除的子键不存在,则产 生一个错误信息;如果值为"false",则在程序调用的时候,删除的子键不存在,也不产生错误信息,程序依然正确运行。所以在具体的程序设计过程中,我 还是推荐使用第二种调用方法。
(2). deletesubkeytree ( )方法:
此方法是彻底删除指定的子键目录,即:删除该子键以及该子键以下的全部子键。由于此方法的破坏性是非常强的,所有在使用的时候要非常主要。在程序中调用此方法的原型就一种,为:
deletesubkeytree ( string subkey ):其中"subkey"就是要彻底删除的子键名称。
(3). deletevalue ( )方法:
此方法是删除指定的键值。在程序中调用此方法的原型就一种,为:
deletevalue ( string value ):其中"value"就是要删除的键值的名称。
在介绍完与删除注册表中注册信息有关方法后,将通过一个程序来说明他们在程序中具体用法。
二. 程序设计和运行环境以及要准备的工作:
i > .视窗系统2000服务器版
ii > ..net framework sdk beta 2版
iii > .由于程序的功能是删除指定的主键、子键和键值,这就需要我们在注册表中先为设置好这些值的位置和名称。具体如下:
在hkey_local_machine主键下面的"software"子键中建立如下子键和键值:
在"software" 子键下建立"aaa"子键。在"aaa"子键下面建立"bbb"子键和"ddd"子键。在"bbb"子键中建立名称为"ccc"的键值,键值的值为 "ccc"。子"ddd"子键中建立子键"eee",并在此子键中建立一个"fff"键值,键值的值为"fff"。程序中要删除的键值是"ccc"键值, 要删除的子键是"bbb",要彻底删除的子键是"ddd"。具体设定如下图所示:
点击小图放大图01:为程序设定的注册表结构图
三. 程序设计的重要步骤:
程序设计的主要步骤就是如何删除键值、不包含任何子键的子键、包含子键的子键。下面就通过程序来具体说明:
(1).如何删除键值。在程序中要删除键值是"ccc"。以下就是程序中删除此键值的具体语句。
registrykey hklm = registry.localmachine ;
registrykey software = hklm.opensubkey ( "software", true ) ;
//打开"software"子键
registrykey no1 = software.opensubkey ( "aaa", true ) ;
//打开"aaa"子键
registrykey no2 = no1.opensubkey ( "bbb" , true ) ;
//打开"bbb"子键
no2.deletevalue( "ccc" ) ;
//删除名称为"ccc"的键值
(2).如何删除不包含任何子键的子键。在程序要删除的子键是"bbb"。以下就是删除此子键的具体程序代码:
registrykey hklm = registry.localmachine ;
registrykey software = hklm.opensubkey ( "software", true ) ;
//打开"software"子键
registrykey no1 = software.opensubkey ( "aaa", true ) ;
//打开"aaa"子键
no1.deletesubkey ( "bbb", false );
//删除名称为"bbb"的子键
(3).如何删除包含子键的子键。在程序中要删除的此子键是"ddd"。以下就是删除此子键的具体程序代码:
registrykey hklm = registry.localmachine ;
hklm.deletesubkey ( "aaa", false );
registrykey software = hklm.opensubkey ( "software", true ) ;
//打开"software"子键
registrykey no1 = software.opensubkey ( "aaa", true ) ;
//打开"aaa"子键
no1.deletesubkeytree ( "ddd" );
//删除名称为"ddd"的子键
四. 本文中的程序源代码( reg.cs )以及运行界面:
reg.cs程序的主要功能就是删除注册表中的键值、不包含子键的子键和包含子键的子键。并且通过按钮"读取注册表",以列表的显示方法来及时了解删除的情况。下图就是程序运行后的界面:
点击小图放大图02:本文中程序的运行界面
reg.cs程序源代码如下:
using system ;
using system.drawing ;
using system.collections ;
using system.componentmodel ;
using system.windows.forms ;
using system.data ;
using microsoft.win32 ;
public class form1 : form
{
private system.componentmodel.container components ;
private listbox listbox1 ;
private button button1 ;
private button button2 ;
private button button3 ;
private button button4 ;
public form1 ( )
{
initializecomponent ( ) ;
}
//清除在程序中使用过的资源
public override void dispose ( )
{
base.dispose ( ) ;
components.dispose ( ) ;
}
//初始化程序中使用到的组件
private void initializecomponent ( )
{
components = new system.componentmodel.container ( ) ;
button1 = new button ( ) ;
button2 = new button ( ) ;
button3 = new button ( ) ;
button4 = new button ( ) ;
listbox1 = new listbox ( ) ;
button1.location = new system.drawing.point ( 16 , 320 ) ;
button1.size = new system.drawing.size ( 75 , 23 ) ;
button1.tabindex = 0 ;
button1.text = "读取注册表" ;
button1.click += new system.eventhandler ( button1_click ) ;
button2.location = new system.drawing.point ( 116 , 320 ) ;
button2.size = new system.drawing.size ( 75 , 23 ) ;
button2.tabindex = 0 ;
button2.text = "删除键值ccc" ;
button2.click += new system.eventhandler ( button2_click ) ;
button3.location = new system.drawing.point ( 216 , 320 ) ;
button3.size = new system.drawing.size ( 75 , 23 ) ;
button3.tabindex = 0 ;
button3.text = "删除子键bbb" ;
button3.click += new system.eventhandler ( button3_click ) ;
button4.location = new system.drawing.point ( 316 , 320 ) ;
button4.size = new system.drawing.size ( 75 , 23 ) ;
button4.tabindex = 0 ;
button4.text = "删除主键ddd" ;
button4.click += new system.eventhandler ( button4_click ) ;
listbox1.location = new system.drawing.point ( 16 , 32 ) ;
listbox1.size = new system.drawing.size ( 496 , 264 ) ;
listbox1.tabindex = 1 ;
this.text = "用visual c#来删除注册表中的主键、子键和键值!" ;
this.autoscalebasesize = new system.drawing.size ( 5 , 13 ) ;
this.clientsize = new system.drawing.size ( 528 , 357 ) ;
this.controls.add ( listbox1 ) ;
this.controls.add ( button1 ) ;
this.controls.add ( button2 ) ;
this.controls.add ( button3 ) ;
this.controls.add ( button4 ) ;
}
protected void button1_click ( object sender , system.eventargs e )
{
listbox1.items.clear ( ) ;
registrykey hklm = registry.localmachine ;
registrykey software = hklm.opensubkey ( "software" ) ;
//打开"software"子键
registrykey no1 = software.opensubkey ( "aaa" ) ;
//打开"aaa"子键
foreach ( string site in no1.getsubkeynames ( ) )
//开始遍历由子键名称组成的字符串数组
{
listbox1.items.add ( site ) ;
//在列表中加入子键名称
registrykey sitekey = no1.opensubkey ( site ) ;
//打开此子键
foreach ( string svalname in sitekey.getvaluenames ( ) )
//开始遍历由指定子键拥有的键值名称组成的字符串数组
{
listbox1.items.add ( " " + svalname + ": " + sitekey.getvalue ( svalname ) ) ;
//在列表中加入键名称和对应的键值
}
}
}
protected void button2_click ( object sender , system.eventargs e )
{
registrykey hklm = registry.localmachine ;
registrykey software = hklm.opensubkey ( "software", true ) ;
//打开"software"子键
registrykey no1 = software.opensubkey ( "aaa", true ) ;
//打开"aaa"子键
registrykey no2 = no1.opensubkey ( "bbb" , true ) ;
//打开"bbb"子键
no2.deletevalue( "ccc" ) ;
//删除名称为"ccc"的键值
}
protected void button3_click ( object sender , system.eventargs e )
{
registrykey hklm = registry.localmachine ;
registrykey software = hklm.opensubkey ( "software", true ) ;
//打开"software"子键
registrykey no1 = software.opensubkey ( "aaa", true ) ;
//打开"aaa"子键
no1.deletesubkey ( "bbb", false );
//删除名称为"bbb"的子键
}
protected void button4_click ( object sender , system.eventargs e )
{
registrykey hklm = registry.localmachine ;
hklm.deletesubkey ( "aaa", false );
registrykey software = hklm.opensubkey ( "software", true ) ;
//打开"software"子键
registrykey no1 = software.opensubkey ( "aaa", true ) ;
//打开"aaa"子键
no1.deletesubkeytree ( "ddd" );
//删除名称为"ddd"的子键
}
public static void main ( )
{
application.run ( new form1 ( ) ) ;
}
}
五. 总结:
本文介绍visual c#注册表编程的一个重要内容,即:如何删除注册信息。由于删除注册信息是一项非常具有破坏性的操作,所以在操作之前一定要注意对注册表的保护工作。
新闻热点
疑难解答