log4net使用详解 <转>

归类于C# 参与评论

说明:本程序演示如何利用log4net记录程序日志信息。log4net是一个功能著名的开源日志记录组件。利用log4net可以方便地将日志 信息记录到文件、控制台、Windows事件日志和数据库(包括MS SQL Server, Access, Oracle9i,Oracle8i,DB2,SQLite)中。并且我们还可以记载控制要记载的日志级别,可以记载的日志类别包括:FATAL(致命错 误)、ERROR(一般错误)、WARN(警告)、INFO(一般信息)、DEBUG(调试信息)。要想获取最新版本的log4net组件库,可以到官方 网站http://logging.apache.org/log4net/下载。现在的最新版本是1.2.10。

下面的例子展示了如何利用log4net记录日志 。

首先从官方网站下载最近版本的log4net组件,现在的最新版本是1.2.10。在程序中我们只需要log4net.dll文件就行了,添加对log4net.dll的引用,就可以在程序中使用了。

接着我们配置相关的配置文件(WinForm对应的是*.exe.config,WebForm对应的是*.config),本实例中是控制台应用程序,配置如下(附各配置的说明):

<?xml version=”1.0″ encoding=”utf-8″ ?>
<configuration>
<configSections>
<section name=”log4net” type=”System.Configuration.IgnoreSectionHandler”/>
</configSections>
<appSettings>
</appSettings>
<log4net>
<!–定义输出到文件中–>
<appender name=”LogFileAppender” type=”log4net.Appender.FileAppender”>
<!–定义文件存放位置–>
<file value=”D:/log4netfile.txt” />
<appendToFile value=”true” />
<rollingStyle value=”Date” />
<datePattern value=”yyyyMMdd-HH:mm:ss” />
<layout type=”log4net.Layout.PatternLayout”>
<!–每条日志末尾的文字说明–>
<footer value=”by 周公” />
<!–输出格式–>
<!–样例:2008-03-26 13:42:32,111 [10] INFO  Log4NetDemo.MainClass [(null)] - info–>
<conversionPattern value=”记录时间:%date 线程ID:[%thread] 日志级别:%-5level 出错类:%logger property:[%property{NDC}] - 错误描述:%message%newline” />
</layout>
</appender>
<!–定义输出到控制台命令行中–>
<appender name=”ConsoleAppender” type=”log4net.Appender.ConsoleAppender”>
<layout type=”log4net.Layout.PatternLayout”>
<conversionPattern value=”%date [%thread] %-5level %logger [%property{NDC}] - %message%newline” />
</layout>
</appender>
<!–定义输出到windows事件中–>
<appender name=”EventLogAppender” type=”log4net.Appender.EventLogAppender”>
<layout type=”log4net.Layout.PatternLayout”>
<conversionPattern value=”%date [%thread] %-5level %logger [%property{NDC}] - %message%newline” />
</layout>
</appender>
<!–定义输出到数据库中,这里举例输出到Access数据库中,数据库为C盘的log4net.mdb–>
<appender name=”AdoNetAppender_Access” type=”log4net.Appender.AdoNetAppender”>
<connectionString value=”Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:log4net.mdb” />
<commandText value=”INSERT INTO LogDetails ([LogDate],[Thread],[Level],[Logger],[Message]) VALUES (@logDate, @thread, @logLevel, @logger,@message)” />
<!–定义各个参数–>
<parameter>
<parameterName value=”@logDate” />
<dbType value=”String” />
<size value=”240″ />
<layout type=”log4net.Layout.PatternLayout”>
<conversionPattern value=”%date” />
</layout>
</parameter>
<parameter>
<parameterName value=”@thread” />
<dbType value=”String” />
<size value=”240″ />
<layout type=”log4net.Layout.PatternLayout”>
<conversionPattern value=”%thread” />
</layout>
</parameter>
<parameter>
<parameterName value=”@logLevel” />
<dbType value=”String” />
<size value=”240″ />
<layout type=”log4net.Layout.PatternLayout”>
<conversionPattern value=”%level” />
</layout>
</parameter>
<parameter>
<parameterName value=”@logger” />
<dbType value=”String” />
<size value=”240″ />
<layout type=”log4net.Layout.PatternLayout”>
<conversionPattern value=”%logger” />
</layout>
</parameter>
<parameter>
<parameterName value=”@message” />
<dbType value=”String” />
<size value=”240″ />
<layout type=”log4net.Layout.PatternLayout”>
<conversionPattern value=”%message” />
</layout>
</parameter>
</appender>
<!–定义日志的输出媒介,下面定义日志以四种方式输出。也可以下面的按照一种类型或其他类型输出。–>
<root>
<!–文件形式记录日志–>
<appender-ref ref=”LogFileAppender” />
<!–控制台控制显示日志–>
<appender-ref ref=”ConsoleAppender” />
<!–Windows事件日志–>
<appender-ref ref=”EventLogAppender” />
<!– 如果不启用相应的日志记录,可以通过这种方式注释掉
<appender-ref ref=”AdoNetAppender_Access” />
–>
</root></log4net>
</configuration>

程序文件:

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Reflection;
using log4net;//注意下面的语句一定要加上,指定log4net使用.config文件来读取配置信息
//如果是WinForm(假定程序为MyDemo.exe,则需要一个MyDemo.exe.config文件)
//如果是WebForm,则从web.config中读取相关信息
[assembly: log4net.Config.XmlConfigurator(Watch = true)]
namespace Log4NetDemo
{
/// <summary>
/// 说明:本程序演示如何利用log4net记录程序日志信息。log4net是一个功能著名的开源日志记录组件。
/// 利用log4net可以方便地将日志信息记录到文件、控制台、Windows事件日志和数据库中(包括MS SQL Server, Access, Oracle9i,Oracle8i,DB2,SQLite)。
/// 下面的例子展示了如何利用log4net记录日志
/// 作者:周公
/// 时间:2008-3-26
/// 首发地址:http://blog.csdn.net/zhoufoxcn/archive/2008/03/26/2220533.aspx
/// </summary>
public class MainClass
{
public static void Main(string[] args)
{
//Application.Run(new MainForm());
//创建日志记录组件实例
ILog log = log4net.LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
//记录错误日志
log.Error(“error”,new Exception(“发生了一个异常”));
//记录严重错误
log.Fatal(“fatal”,new Exception(“发生了一个致命错误”));
//记录一般信息
log.Info(“info”);
//记录调试信息
log.Debug(“debug”);
//记录警告信息
log.Warn(“warn”);
Console.WriteLine(“日志记录完毕。”);
Console.Read();
}
}
}

运行结果:

控制台上的输出


日志文件内容

 

在这里需要特别说明一下,注意上面的代码中有这么一句:[assembly: log4net.Config.XmlConfigurator(Watch = true)](在需要使用log4net的类的namespace处),如果没有这句就会在调试时得到如下留言中所说的“程序调试起来时isDebugEnable”的情况,希望大家注意。

关于未尽之处,请看周公对下面读者的一些问题的答复《Log4Net使用详解(续)》

原文地址:http://blog.csdn.net/zhoufoxcn/article/details/2220533

自定义控件之WinForm中透明Label

归类于C# 参与评论

WinForm中并没有真正的透明Label,所以我们需要一个自定义控件来创建透明的Label,关键代码如下,这个代码是两年前我不记得从哪里找到的了。今天又看到了,所以记录下来。也许会用得到。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Drawing2D;

namespace Lyjt.Highway.Monitoring.bin
{
public partial class 透明Label : UserControl
{
#region Local Variables

public enum ShapeBorderStyles
{
ShapeBSNone,
ShapeBSFixedSingle,
};

private ShapeBorderStyles _borderStyle = ShapeBorderStyles.ShapeBSNone;
private System.Drawing.Color _backColor = Color.Black;
private System.Drawing.Color _borderColor = Color.White;
private int _radius = 20;
private int _opacity = 125;
private string _text = “doaTransparentLabel”;

//  Local Variables for text
public enum TextAlignment
{
Left,
Center,
Right
};

public enum MoveType
{
None,
RightToLeft,
DownToUp,
LeftToRight,
UpToDown
}

protected TextAlignment _textAlign = TextAlignment.Center;
protected MoveType _moving = MoveType.None;
protected bool _isSelected = false;
private System.Drawing.Color _dimmedColor = Color.LightGray;

// Work Variables
protected int pointX = 0;
protected int pointY = 0;
protected Rectangle iRect = new Rectangle();
protected Rectangle txtRect = new Rectangle();

#endregion

#region Constructor
public 透明Label()
{
InitializeComponent();
base.BackColor = Color.Transparent;
SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw | ControlStyles.SupportsTransparentBackColor | ControlStyles.UserPaint, true);
SetStyle(ControlStyles.Opaque, false);
UpdateStyles();
this.components = new System.ComponentModel.Container();
this.timer1 = new System.Windows.Forms.Timer(this.components);
//
// timer1
//
this.timer1.Enabled = false;
this.timer1.Tick += new System.EventHandler(this.timer1_Tick);
this.timer1.Interval = 100;
}
#endregion

#region Properties

[DefaultValue(typeof(Color), "Black")]
public new Color BackColor
// Gets or sets the background color of the control.
{
get { return _backColor; }
set { _backColor = value; Invalidate(); }
}

[
Bindable(true),
Category("Appearance"),
DefaultValue(ShapeBorderStyles.ShapeBSNone),
Description("Style of border to be drawn around control")
]
public ShapeBorderStyles ShapeBorderStyle
{
get { return _borderStyle; }
set { _borderStyle = value; this.Invalidate(); }
}

[DefaultValue(typeof(Color), "White"), Category("Appearance"), Description("The border color of the control.")]
/// Gets or sets the outer border color of the control.
public Color BorderColor
{
get { return _borderColor; }
set { _borderColor = value; Invalidate(); }
}

[
Bindable(true),
Category("Appearance"),
DefaultValue(125),
Description("The alpha value used to blend the control's background. Valid values are 0 through 255.")
]
public int Opacity
{
get { return _opacity; }
set { _opacity = value; this.Invalidate(); }
}

[
Bindable(true),
Category("Layout"),
DefaultValue(20),
Description("Radius of rounded borders")
]
public int Radius
{
get { return _radius; }
set { _radius = value; this.Invalidate(); }
}

[
Bindable(true),
Category("Appearance"),
DefaultValue("DOATransparentLabel"),
Description("Text in the DOATransparentLabel")
]
public String Caption
{
get { return _text; }
set { _text = value; this.Invalidate(); }
}

public override Font Font
{
get { return base.Font; }
set { base.Font = value; this.Invalidate(); }
}

public override Color ForeColor
{
get { return base.ForeColor; }
set { base.ForeColor = value; this.Invalidate(); }
}

[
Bindable(true),
Category("Appearance"),
Description("Dimmed Color"),
]
public Color DimmedColor
{
get { return _dimmedColor; }
set { _dimmedColor = value; this.Invalidate(); }
}

[
Bindable(true),
Category("Behavior"),
Description("Text movement"),
DefaultValue(MoveType.None)
]
public MoveType Moving
{
get { return _moving; }
set { _moving = value; this.Invalidate(); }
}

[
Bindable(true),
Category("Appearance"),
Description("Text alignment (Left, Right or Center), only with Moving None"),
DefaultValue(TextAlignment.Center)
]
public TextAlignment TextAlign
{
get { return _textAlign; }
set { _textAlign = value; this.Invalidate(); }
}

[
Bindable(true),
Category("Behavior"),
Description("Active the text movement"),
DefaultValue(false)
]
public bool MovingActive
{
get { return this.timer1.Enabled; }
set
{
if (value == false) _moving = MoveType.None;
this.timer1.Enabled = value;
this.Invalidate();
}
}

#endregion

#region Methods

protected override void OnPaint(PaintEventArgs e)
{
SmoothingMode sm = e.Graphics.SmoothingMode;
e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
if (_borderStyle == ShapeBorderStyles.ShapeBSFixedSingle)
DrawBorder(e.Graphics);
DrawLabelBackground(e.Graphics);
DrawText(e);
e.Graphics.SmoothingMode = sm;
}

private void DrawBorder(Graphics g)
{
Rectangle rect = this.ClientRectangle;
rect.Width–;
rect.Height–;
using (GraphicsPath bp = GetPath(rect, _radius))
{
using (Pen p = new Pen(_borderColor))
{
g.DrawPath(p, bp);
}
}
}

private void DrawLabelBackground(Graphics g)
{
Rectangle rect = this.ClientRectangle;
iRect = rect;
rect.X++;
rect.Y++;
rect.Width -= 2;
rect.Height -= 2;
using (GraphicsPath bb = GetPath(rect, _radius))
{
using (Brush br = new SolidBrush(Color.FromArgb(_opacity, _backColor)))
{
g.FillPath(br, bb);
}
}
}

protected GraphicsPath GetPath(Rectangle rc, int r)
//  Build the path with the round corners in the rectangle
//  r is the radious of rounded corner.
{
int x = rc.X, y = rc.Y, w = rc.Width, h = rc.Height;
r = r << 1;
GraphicsPath path = new GraphicsPath();
if (r > 0)
//  If the radious of rounded corner is greater than one side then
//  do the side rounded
{
if (r > h) { r = h; };                              //Rounded
if (r > w) { r = w; };                              //Rounded
path.AddArc(x, y, r, r, 180, 90);                    //Upper left corner
path.AddArc(x + w – r, y, r, r, 270, 90);            //Upper right corner
path.AddArc(x + w – r, y + h – r, r, r, 0, 90);        //Lower right corner
path.AddArc(x, y + h – r, r, r, 90, 90);            //Lower left corner
path.CloseFigure();
}
else
//  If the radious of rounded corner is zero then the path is a rectangle
{
path.AddRectangle(rc);
}

return path;
}

protected void DrawText(PaintEventArgs pe)
{
//This is a workaround to get MeasureString to work properly
//pe.Graphics.TextRenderingHint = TextRenderingHint.AntiAlias;
SizeF sz = pe.Graphics.MeasureString(_text, base.Font);
switch (_moving)
{
case MoveType.None:
NoMove();
break;
case MoveType.RightToLeft:
MoveRightToLeft();
break;
case MoveType.DownToUp:
MoveDownToUp();
break;
case MoveType.LeftToRight:
MoveLeftToRight();
break;
case MoveType.UpToDown:
MoveUpToDown();
break;
}
//Rectangle bounds for the text
txtRect = new Rectangle(this.pointX, this.pointY,
(int)sz.Width + 1, (int)sz.Height);

//If the mouse is passing over the text it is selected and will be dimmed
//otherwise nothing.
Brush brText = new SolidBrush(base.ForeColor);
Brush brTextDimmed = new SolidBrush(_dimmedColor);
if (_isSelected)
pe.Graphics.DrawString(_text,
base.Font,
brTextDimmed,
txtRect);
else
pe.Graphics.DrawString(_text,
base.Font,
brText,
txtRect);
}

protected void NoMove()
{
//Align text
switch (_textAlign)
{
case TextAlignment.Left:
pointX = (int)this.iRect.X;
break;
case TextAlignment.Center:
pointX = (this.iRect.Width – this.txtRect.Width) / 2;
break;
case TextAlignment.Right:
pointX = (this.iRect.Width – this.txtRect.Width);
break;
}
pointY = (this.iRect.Height – this.txtRect.Height) / 2;
}

protected void MoveRightToLeft()
{
if (pointX < -this.txtRect.Width)
{ pointX = this.iRect.X + this.iRect.Width; }
else
{ pointX -= 2; }
pointY = (this.iRect.Height – this.txtRect.Height) / 2;
}

protected void MoveDownToUp()
{
pointX = (this.iRect.Width – this.txtRect.Width) / 2;
if (pointY < -this.txtRect.Height)
{ pointY = (int)this.iRect.Y + this.iRect.Height; }
else
{ pointY -= 2; }
}

protected void MoveLeftToRight()
{
if (pointX > this.iRect.X + this.iRect.Width)
{ pointX = this.iRect.X – this.txtRect.Width; }
else
{ pointX += 2; }
pointY = (this.iRect.Height – this.txtRect.Height) / 2;
}

protected void MoveUpToDown()
{
pointX = (this.iRect.Width – this.txtRect.Width) / 2;
if (pointY > this.iRect.Y + this.iRect.Height)
{ pointY = (int)this.iRect.Y – this.iRect.Height; }
else
{ pointY += 2; }
}

protected override void OnMouseEnter(EventArgs e)
{
base.OnMouseEnter(e);
_isSelected = true;
this.Invalidate();
}

protected override void OnMouseLeave(EventArgs e)
{
base.OnMouseLeave(e);
_isSelected = false;
this.Invalidate();
}

private void timer1_Tick(object sender, System.EventArgs e)
{
this.Invalidate();
this.Update();
}

#endregion
}
}

winform相对路径和绝对路径 各种操作详解

归类于C# 参与评论

相对路径获取
string   path   =   System.IO.Directory.GetCurrentDirectory();//获取应用程序的当前工作目录。
string   str1   =   Application.StartupPath;//获取启动了应用程序的可执行文件的路径,不包括可执行文件的名称
string   str2   =   Application.ExecutablePath;//获取启动了应用程序的可执行文件的路径,包括可执行文件的名称。
string   str3   =   Environment.CurrentDirectory;//获取和设置当前目录(即该进程从中启动的目录)的完全限定路径。

System.Reflection.Assembly   ass=   System.Reflection.Assembly.GetExecutingAssembly();//获取当前代码正从中运行的   Assembly
string   strConfigLoc=ass.Location;//如果包含清单的已加载文件没有被影像复制,则获取该文件的基本代码格式的位置
FileInfo   FileInfoObj=   new   FileInfo(strConfigLoc);
strConfigLoc=FileInfoObj.DirectoryName;
MessageBox.Show(strConfigLoc);

C# Winform中如何获取文件路径

获取文件名方法:

用System.IO.Path.GetFileName和System.IO.Path.GetFileNameWithoutExtension(无扩展名)的方法

获取文件路径方法:

//获取当前进程的完整路径,包含文件名(进程名)。
string str = this.GetType().Assembly.Location;
result: X:\xxx\xxx\xxx.exe (.exe文件所在的目录+.exe文件名)

//获取新的 Process 组件并将其与当前活动的进程关联的主模块的完整路径,包含文件名(进程名)。
string str = System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName;
result: X:\xxx\xxx\xxx.exe (.exe文件所在的目录+.exe文件名)

//获取和设置当前目录(即该进程从中启动的目录)的完全限定路径。
string str = System.Environment.CurrentDirectory;
result: X:\xxx\xxx (.exe文件所在的目录)

//获取当前 Thread 的当前应用程序域的基目录,它由程序集冲突解决程序用来探测程序集。
string str = System.AppDomain.CurrentDomain.BaseDirectory;
result: X:\xxx\xxx\ (.exe文件所在的目录+”\”)

//获取和设置包含该应用程序的目录的名称。
string str = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
result: X:\xxx\xxx\ (.exe文件所在的目录+”\”)

//获取启动了应用程序的可执行文件的路径,不包括可执行文件的名称。
string str = System.Windows.Forms.Application.StartupPath;
result: X:\xxx\xxx (.exe文件所在的目录)

//获取启动了应用程序的可执行文件的路径,包括可执行文件的名称。
string str = System.Windows.Forms.Application.ExecutablePath;
result: X:\xxx\xxx\xxx.exe (.exe文件所在的目录+.exe文件名)

//获取应用程序的当前工作目录(不可靠)。
string str = System.IO.Directory.GetCurrentDirectory();
result: X:\xxx\xxx (.exe文件所在的目录)

C# 获取路径中,文件名、目录、扩展名等

string path = “C:\\dir1\\dir2\\foo.txt”;
string str = “GetFullPath:” + Path.GetFullPath(path) + “\r\n”;
str += “GetDirectoryName:” + Path.GetDirectoryName(path) + “\r\n”;
str += “GetFileName:” + Path.GetFileName(path) + “\r\n”;
str += “GetFileNameWithoutExtension:” + Path.GetFileNameWithoutExtension(path) + “\r\n”;
str += “GetExtension:” + Path.GetExtension(path) + “\r\n”;
str += “GetPathRoot:” + Path.GetPathRoot(path) + “\r\n”;
MessageBox.Show(str);

结果:
GetFullPath:C:\dir1\dir2\foo.txt
GetDirectoryName:C:\dir1\dir2
GetFileName:foo.txt
GetFileNameWithoutExtension:foo
GetExtension:.txt
GetPathRoot:C:\

这里要说明 path 是如何C# 轻松获取路径中文件名、目录、扩展名等判断目录和文件名的:它把最后一个 \ 后面的内容当作是文件名。 // 内容来自js4j.com//

  • C:\dir1\dir2\foo.txt 文件名是 foo.txt,目录名是 C:\dir1\dir2。
  • C:\dir1\dir2\ 文件名是零长度字符串,目录名是 C:\dir1\dir2。
  • C:\dir1\dir2 文件名是 dir2,目录名是 C:\dir1。

VS2008调试快捷键【收集整理】

归类于C# 参与评论

F6: 生成解决方案

Ctrl+F6: 生成当前项目

F7: 查看代码

Shift+F7: 查看窗体设计器

F5: 启动调试

Ctrl+F5: 开始执行(不调试)

Shift+F5: 停止调试

Ctrl+Shift+F5: 重启调试

F9: 切换断点

Ctrl+F9: 启用/停止断点

Ctrl+Shift+F9: 删除全部断点

F10: 逐过程

Ctrl+F10: 运行到光标处

F11: 逐语句

Ctrl+K+D: 代码快速格式化

[整理]C#文件操作大全

归类于C# 参与评论

[整理]C#文件操作大全

1.创建文件夹
//using System.IO;
Directory.CreateDirectory(%%1);
2.创建文件
//using System.IO;
File.Create(%%1);
3.删除文件
//using System.IO;
File.Delete(%%1);
4.删除文件夹
//using System.IO;
Directory.Delete(%%1);
5.删除一个目录下所有的文件夹
//using System.IO;
foreach (string dirStr in Directory.GetDirectories(%%1))
{
DirectoryInfo dir = new DirectoryInfo(dirStr);
ArrayList folders=new ArrayList();
FileSystemInfo[] fileArr = dir.GetFileSystemInfos();
for (int i = 0; i < folders.Count; i++)
{
FileInfo f = folders[i] as FileInfo;
if (f == null)
{
DirectoryInfo d = folders[i] as DirectoryInfo;
d.Delete();
}
}
}
6.清空文件夹
//using System.IO;
Directory.Delete(%%1,true);
Directory.CreateDirectory(%%1);
7.读取文件
//using System.IO;
StreamReader s = File.OpenText(%%1);
string %%2 = null;
while ((%%2 = s.ReadLine()) != null){
%%3
}
s.Close();
8.写入文件
//using System.IO;
FileInfo f = new FileInfo(%%1);
StreamWriter w = f.CreateText();
w.WriteLine(%%2);
w.Close();
9.写入随机文件
//using System.IO;
byte[] dataArray = new byte[100000];//new Random().NextBytes(dataArray);
using(FileStream FileStream = new FileStream(%%1, FileMode.Create)){
// Write the data to the file, byte by byte.
for(int i = 0; i < dataArray.Length; i++){
FileStream.WriteByte(dataArray[i]);
}
// Set the stream position to the beginning of the file.
FileStream.Seek(0, SeekOrigin.Begin);
// Read and verify the data.
for(int i = 0; i < FileStream.Length; i++){
if(dataArray[i] != FileStream.ReadByte()){
//写入数据错误
return;
}
}
//”数据流”+FileStream.Name+”已验证”
}
10.读取文件属性
//using System.IO;
FileInfo f = new FileInfo(%%1);//f.CreationTime,f.FullName
if((f.Attributes & FileAttributes.ReadOnly) != 0){
%%2
}
else{
%%3
}
11.写入属性
//using System.IO;
FileInfo f = new FileInfo(%%1);
//设置只读
f.Attributes = myFile.Attributes | FileAttributes.ReadOnly;
//设置可写
f.Attributes = myFile.Attributes & ~FileAttributes.ReadOnly;
12.枚举一个文件夹中的所有文件夹
//using System.IO;
foreach (string %%2 in Directory.GetDirectories(%%1)){
%%3
}
/*
DirectoryInfo dir = new DirectoryInfo(%%1);
FileInfo[] files = dir.GetFiles(“*.*”);
foreach(FileInfo %%2 in files){
%%3
}
*/
13.复制文件夹
/*
using System.IO;
using System.Collections;
*/
string path = (%%2.LastIndexOf(“\\”) == %%2.Length – 1) ? %%2 : %%2+”\\”;
string parent = Path.GetDirectoryName(%%1);
Directory.CreateDirectory(path + Path.GetFileName(%%1));
DirectoryInfo dir = new DirectoryInfo((%%1.LastIndexOf(“\\”) == %%1.Length – 1) ? %%1 : %%1 + “\\”);
FileSystemInfo[] fileArr = dir.GetFileSystemInfos();
Queue<FileSystemInfo> Folders = new Queue<FileSystemInfo>(dir.GetFileSystemInfos());
while (Folders.Count>0)
{
FileSystemInfo tmp = Folders.Dequeue();
FileInfo f = tmp as FileInfo;
if (f == null)
{
DirectoryInfo d = tmp as DirectoryInfo;
Directory.CreateDirectory(d.FullName.Replace((parent.LastIndexOf(“\\”) == parent.Length – 1) ? parent : parent + “\\”, path));
foreach (FileSystemInfo fi in d.GetFileSystemInfos())
{
Folders.Enqueue(fi);
}
}
else
{
f.CopyTo(f.FullName.Replace(parent, path));
}
}
14.复制目录下所有的文件夹到另一个文件夹下
/*
using System.IO;
using System.Collections;
*/
DirectoryInfo d = new DirectoryInfo(%%1);
foreach (DirectoryInfo dirs in d.GetDirectories())
{
Queue<FileSystemInfo> al = new Queue<FileSystemInfo>(dirs.GetFileSystemInfos());
while (al.Count > 0)
{
FileSystemInfo temp = al.Dequeue();
FileInfo file = temp as FileInfo;
if (file == null)
{
DirectoryInfo directory = temp as DirectoryInfo;
Directory.CreateDirectory(path + directory.Name);
foreach (FileSystemInfo fsi in directory.GetFileSystemInfos())
al.Enqueue(fsi);
}
else
File.Copy(file.FullName, path + file.Name);
}
}
15.移动文件夹
/*
using System.IO;
using System.Collections;
*/
string filename = Path.GetFileName(%%1);
string path=(%%2.LastIndexOf(“\\”) == %%2.Length – 1) ? %%2 : %%2 + “\\”;
if (Path.GetPathRoot(%%1) == Path.GetPathRoot(%%2))
Directory.Move(%%1, path + filename);
else
{
string parent = Path.GetDirectoryName(%%1);
Directory.CreateDirectory(path + Path.GetFileName(%%1));
DirectoryInfo dir = new DirectoryInfo((%%1.LastIndexOf(“\\”) == %%1.Length – 1) ? %%1 : %%1 + “\\”);
FileSystemInfo[] fileArr = dir.GetFileSystemInfos();
Queue<FileSystemInfo> Folders = new Queue<FileSystemInfo>(dir.GetFileSystemInfos());
while (Folders.Count > 0)
{
FileSystemInfo tmp = Folders.Dequeue();
FileInfo f = tmp as FileInfo;
if (f == null)
{
DirectoryInfo d = tmp as DirectoryInfo;
DirectoryInfo dpath = new DirectoryInfo(d.FullName.Replace((parent.LastIndexOf(“\\”) == parent.Length – 1) ? parent : parent + “\\”, path));
dpath.Create();
foreach (FileSystemInfo fi in d.GetFileSystemInfos())
{
Folders.Enqueue(fi);
}
}
else
{
f.MoveTo(f.FullName.Replace(parent, path));
}
}
Directory.Delete(%%1, true);
}
16.移动目录下所有的文件夹到另一个目录下
/*
using System.IO;
using System.Collections;
*/
string filename = Path.GetFileName(%%1);
if (Path.GetPathRoot(%%1) == Path.GetPathRoot(%%2))
foreach (string dir in Directory.GetDirectories(%%1))
Directory.Move(dir, Path.Combine(%%2,filename));
else
{
foreach (string dir2 in Directory.GetDirectories(%%1))
{
string parent = Path.GetDirectoryName(dir2);
Directory.CreateDirectory(Path.Combine(%%2, Path.GetFileName(dir2)));
string dir = (dir2.LastIndexOf(“\\”) == dir2.Length – 1) ? dir2 : dir2 + “\\”;
DirectoryInfo dirdir = new DirectoryInfo(dir);
FileSystemInfo[] fileArr = dirdir.GetFileSystemInfos();
Queue<FileSystemInfo> Folders = new Queue<FileSystemInfo>(dirdir.GetFileSystemInfos());
while (Folders.Count > 0)
{
FileSystemInfo tmp = Folders.Dequeue();
FileInfo f = tmp as FileInfo;
if (f == null)
{
DirectoryInfo d = tmp as DirectoryInfo;
DirectoryInfo dpath = new DirectoryInfo(d.FullName.Replace((parent.LastIndexOf(“\\”) == parent.Length – 1) ? parent : parent + “\\”, %%2));
dpath.Create();
foreach (FileSystemInfo fi in d.GetFileSystemInfos())
{
Folders.Enqueue(fi);
}
}
else
{
f.MoveTo(f.FullName.Replace(parent, %%2));
}
}
dirdir.Delete(true);
}
}
17.以一个文件夹的框架在另一个目录创建文件夹和空文件
/*
using System.IO;
using System.Collections;
*/
bool b=false;
string path = (%%2.LastIndexOf(“\\”) == %%2.Length – 1) ? %%2 : %%2 + “\\”;
string parent = Path.GetDirectoryName(%%1);
Directory.CreateDirectory(path + Path.GetFileName(%%1));
DirectoryInfo dir = new DirectoryInfo((%%1.LastIndexOf(“\\”) == %%1.Length – 1) ? %%1 : %%1 + “\\”);
FileSystemInfo[] fileArr = dir.GetFileSystemInfos();
Queue<FileSystemInfo> Folders = new Queue<FileSystemInfo>(dir.GetFileSystemInfos());
while (Folders.Count > 0)
{
FileSystemInfo tmp = Folders.Dequeue();
FileInfo f = tmp as FileInfo;
if (f == null)
{
DirectoryInfo d = tmp as DirectoryInfo;
Directory.CreateDirectory(d.FullName.Replace((parent.LastIndexOf(“\\”) == parent.Length – 1) ? parent : parent + “\\”, path));
foreach (FileSystemInfo fi in d.GetFileSystemInfos())
{
Folders.Enqueue(fi);
}
}
else
{
if(b) File.Create(f.FullName.Replace(parent, path));
}
}
18.复制文件
//using System.IO;
File.Copy(%%1,%%2);
19.复制一个文件夹下所有的文件到另一个目录
//using System.IO;
foreach (string fileStr in Directory.GetFiles(%%1))
File.Copy((%%1.LastIndexOf(“\\”) == %%1.Length – 1) ? %%1 +Path.GetFileName(fileStr): %%1 + “\\”+Path.GetFileName(fileStr),(%%2.LastIndexOf(“\\”) == %%2.Length – 1) ? %%2 +Path.GetFileName(fileStr): %%2 + “\\”+Path.GetFileName(fileStr));
20.提取扩展名
//using System.IO;
string %%2=Path.GetExtension(%%1);
21.提取文件名
//using System.IO;
string %%2=Path.GetFileName(%%1);
22.提取文件路径
//using System.IO;
string %%2=Path.GetDirectoryName(%%1);
23.替换扩展名
//using System.IO;
File.ChangeExtension(%%1,%%2);
24.追加路径
//using System.IO;
string %%3=Path.Combine(%%1,%%2);
25.移动文件
//using System.IO;
File.Move(%%1,%%2+”\\”+file.getname(%%1));
26.移动一个文件夹下所有文件到另一个目录
foreach (string fileStr in Directory.GetFiles(%%1))
File.Move((%%1.LastIndexOf(“\\”) == %%1.Length – 1) ? %%1 +Path.GetFileName(fileStr): %%1 + “\\”+Path.GetFileName(fileStr),(%%2.LastIndexOf(“\\”) == %%2.Length – 1) ? %%2 +Path.GetFileName(fileStr): %%2 + “\\”+Path.GetFileName(fileStr));
27.指定目录下搜索文件
/*
using System.Text;
using System.IO;
*/
string fileName=%%1;
string dirName=%%2;
DirectoryInfo   dirc=new   DirectoryInfo(dirName);
foreach(FileInfo   file   in   dirc.GetFiles()) {
if(file.Name.IndexOf(fileName)>-1)
return file.FullName;
}
foreach(DirectoryInfo   dir   in   dirc.GetDirectories())   {
return   GetFile(fileName,dir.FullName);
}
return   “找不到指定的文件”;
}
28.打开对话框
OpenFileDialog penFileDialog=new OpenFileDialog();
openFileDialog.InitialDirectory=\”c:\\\\\”;//注意这里写路径时要用c:\\\\而不是c:\\
openFileDialog.Filter=\”文本文件|*.*|C#文件|*.cs|所有文件|*.*\”;
openFileDialog.RestoreDirectory=true;
openFileDialog.FilterIndex=1;
if (openFileDialog.ShowDialog()==DialogResult.OK) {
fName=openFileDialog.FileName;
File fileOpen=new File(fName);
isFileHaveName=true;
%%1=fileOpen.ReadFile();
%%1.AppendText(\”\”);
}
29.文件分割
//using System.IO;
FileStream fsr = new FileStream(%%1, FileMode.Open, FileAccess.Read);
byte[] btArr = new byte[fsr.Length];
fsr.Read(btArr, 0, btArr.Length);
fsr.Close();
string strFileName=%%1.Substring(%%1.LastIndexOf(“\\”)+1);
FileStream fsw = new FileStream(%%2 + strFileName + “1″, FileMode.Create, FileAccess.Write);
fsw.Write(btArr, 0, btArr.Length/2);
fsw.Close();
fsw = new FileStream(%%2 + strFileName + “2″, FileMode.Create, FileAccess.Write);
fsw.Write(btArr, btArr.Length/2, btArr.Length-btArr.Length/2);
fsw.Close();
30.文件合并
//using System.IO;
string strFileName = %%1.Substring(%%1.LastIndexOf(“\\”) + 1);
FileStream fsr1 = new FileStream(%%2 + strFileName + “1″, FileMode.Open, FileAccess.Read);
FileStream fsr2 = new FileStream(%%2 + strFileName + “2″, FileMode.Open, FileAccess.Read);
byte[] btArr = new byte[fsr1.Length+fsr2.Length];
fsr1.Read(btArr, 0, Convert.ToInt32(fsr1.Length));
fsr2.Read(btArr, Convert.ToInt32(fsr1.Length), Convert.ToInt32(fsr2.Length));
fsr1.Close();fsr2.Close();
FileStream fsw = new FileStream(%%2 + strFileName, FileMode.Create, FileAccess.Write);
fsw.Write(btArr, 0, btArr.Length);
fsw.Close();
31.文件简单加密
//using System.IO;
//读文件
FileStream fsr = new FileStream(%%1, FileMode.Open, FileAccess.Read);
byte[] btArr = new byte[fsr.Length];
fsr.Read(btArr, 0, btArr.Length);
fsr.Close();
for (int i = 0; i < btArr.Length; i++){ //加密
int ibt = btArr[i];
ibt += 100;
ibt %= 256;
btArr[i] = Convert.ToByte(ibt);
}
//写文件
string strFileName = Path.GetExtension(%%1);
FileStream fsw = new FileStream(%%2+”/” + “enc_” + strFileName, FileMode.Create, FileAccess.Write);
fsw.Write(btArr, 0, btArr.Length);
fsw.Close();
32.文件简单解密
//using System.IO;
FileStream fsr = new FileStream(%%1, FileMode.Open, FileAccess.Read);
byte[] btArr = new byte[fsr.Length];
fsr.Read(btArr, 0, btArr.Length);
fsr.Close();
for (int i = 0; i < btArr.Length; i++){ //解密
int ibt = btArr[i];
ibt -= 100;
ibt += 256;
ibt %= 256;
btArr[i] = Convert.ToByte(ibt);
}
//写文件
string strFileName = Path.GetExtension(%%1);
FileStream fsw = new FileStream(%%2 +”/” + strFileName, FileMode.Create, FileAccess.Write);
fsw.Write(btArr, 0, btArr.Length);
fsw.Close();
33.读取ini文件属性
//using System.Runtime.InteropServices;
//[DllImport("kernel32")]//返回取得字符串缓冲区的长度
//private static extern long GetPrivateProfileString(string section,string key, string def,StringBuilder retVal,int size,string filePath);
string Section=%%1;
string Key=%%2;
string NoText=%%3;
string iniFilePath=”Setup.ini”;
string %%4=String.Empty;
if(File.Exists(iniFilePath)){
StringBuilder temp = new StringBuilder(1024);
GetPrivateProfileString(Section,Key,NoText,temp,1024,iniFilePath);
%%4=temp.ToString();
}
34.合并一个目录下所有的文件
//using System.IO;
FileStream fsw = new FileStream(%%2, FileMode.Create, FileAccess.Write);
foreach (string fileStr in Directory.GetFiles(%%1))
{
FileStream fsr1 = new FileStream(fileStr, FileMode.Open, FileAccess.Read);
byte[] btArr = new byte[fsr1.Length];
fsr1.Read(btArr, 0, Convert.ToInt32(fsr1.Length));
fsr1.Close();
fsw.Write(btArr, 0, btArr.Length);
}
fsw.Close();
35.写入ini文件属性
//using System.Runtime.InteropServices;
//[DllImport("kernel32")]//返回0表示失败,非0为成功
//private static extern long WritePrivateProfileString(string section,string key, string val,string filePath);
string Section=%%1;
string Key=%%2;
string Value=%%3;
string iniFilePath=”Setup.ini”;
bool %%4=false;
if(File.Exists(iniFilePath))
{
long pStation = WritePrivateProfileString(Section,Key,Value,iniFilePath);
if(OpStation == 0)
{
%%4=false;
}
else
{
%%4=true;
}
}
36.获得当前路径
string %%1=Environment.CurrentDirectory;
37.读取XML数据库
//using System.Xml;
XmlDocument doc=new XmlDocument();
doc.Load(%%1);
string %%9;
XmlElement xe=doc.GetElementById(%%7);
XmlNodeList elemList=xe.ChildNodes;
foreach(XmlNode elem in elemList)
{
if(elem.NodeType==%%8)
{
%%9=elem.Value;
break;
}
}
38.写入XML数据库
//using System.Xml;
XmlDocument doc=new XmlDocument();
doc.Load(%%1);
XmlNode root=doc.DocumentElement;
XmlElement book=doc.CreateElement(%%3);
XmlElement book=doc.CreateElement(%%5);
XmlElement port=doc.CreateElement(%%6);
book.SetAttribute(%%4,root.ChildNodes.Count.ToString());
author.InnerText=%%8;
book.appendChild(author);
book.appendChild(port);
root.appendChild(book);
doc.Save(%%1);
39.ZIP压缩文件
/*
using System.IO;
using System.IO.Compression;
*/
FileStream infile;
try
{
// Open the file as a FileStream object.
infile = new FileStream(%%1, FileMode.Open, FileAccess.Read, FileShare.Read);
byte[] buffer = new byte[infile.Length];
// Read the file to ensure it is readable.
int count = infile.Read(buffer, 0, buffer.Length);
if (count != buffer.Length)
{
infile.Close();
//Test Failed: Unable to read data from file
return;
}
infile.Close();
MemoryStream ms = new MemoryStream();
// Use the newly created memory stream for the compressed data.
DeflateStream compressedzipStream = new DeflateStream(ms, CompressionMode.Compress, true);
//Compression
compressedzipStream.Write(buffer, 0, buffer.Length);
// Close the stream.
compressedzipStream.Close();
//Original size: {0}, Compressed size: {1}”, buffer.Length, ms.Length);
FileInfo f = new FileInfo(%%2);
StreamWriter w = f.CreateText();
w.Write(buffer,0,ms.Length);
w.Close();
} // end try
catch (InvalidDataException)
{
//Error: The file being read contains invalid data.
} catch (FileNotFoundException)
{
//Error:The file specified was not found.
} catch (ArgumentException)
{
//Error: path is a zero-length string, contains only white space, or contains one or more invalid characters
} catch (PathTooLongException)
{
//Error: The specified path, file name, or both exceed the system-defined maximum length. For example, on Windows-based
platforms, paths must be less than 248 characters, and file names must be less than 260 characters.
} catch (DirectoryNotFoundException)
{
//Error: The specified path is invalid, such as being on an unmapped drive.
} catch (IOException)
{
//Error: An I/O error occurred while opening the file.
} catch (UnauthorizedAccessException)
{
//Error: path specified a file that is read-only, the path is a directory, or caller does not have the required
permissions.
} catch (IndexOutOfRangeException)
{
//Error: You must provide parameters for MyGZIP.
}
40.ZIP解压缩
/*
using System.IO;
using System.IO.Compression;
*/
FileStream infile;
try
{
// Open the file as a FileStream object.
infile = new FileStream(%%1, FileMode.Open, FileAccess.Read, FileShare.Read);
byte[] buffer = new byte[infile.Length];
// Read the file to ensure it is readable.
int count = infile.Read(buffer, 0, buffer.Length);
if (count != buffer.Length)
{
infile.Close();
//Test Failed: Unable to read data from file
return;
}
infile.Close();
MemoryStream ms = new MemoryStream();
// ms.Position = 0;
DeflateStream zipStream = new DeflateStream(ms, CompressionMode.Decompress);
//Decompression
byte[] decompressedBuffer = new byte[buffer.Length *2];
zipStream.Close();
FileInfo f = new FileInfo(%%2);
StreamWriter w = f.CreateText();
w.Write(decompressedBuffer);
w.Close();
} // end try
catch (InvalidDataException)
{
//Error: The file being read contains invalid data.
}
catch (FileNotFoundException)
{
//Error:The file specified was not found.
}
catch (ArgumentException)
{
//Error: path is a zero-length string, contains only white space, or contains one or more invalid characters
}
catch (PathTooLongException)
{
//Error: The specified path, file name, or both exceed the system-defined maximum length. For example, on Windows-based
platforms, paths must be less than 248 characters, and file names must be less than 260 characters.
}
catch (DirectoryNotFoundException)
{
//Error: The specified path is invalid, such as being on an unmapped drive.
}
catch (IOException)
{
//Error: An I/O error occurred while opening the file.
}
catch (UnauthorizedAccessException)
{
//Error: path specified a file that is read-only, the path is a directory, or caller does not have the required
permissions.
}
catch (IndexOutOfRangeException)
{
//Error: You must provide parameters for MyGZIP.
}
41.获得应用程序完整路径
string %%1=Application.ExecutablePath;
42.ZIP压缩文件夹
/*
using System.IO;
using System.IO.Compression;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
*/
private void CreateCompressFile(Stream source, string destinationName)
{
using (Stream destination = new FileStream(destinationName, FileMode.Create, FileAccess.Write))
{
using (GZipStream utput = new GZipStream(destination, CompressionMode.Compress))
{
byte[] bytes = new byte[4096];
int n;
while ((n = source.Read(bytes, 0, bytes.Length)) != 0)
{
output.Write(bytes, 0, n);
}
}
}
}
ArrayList list = new ArrayList();
foreach (string f in Directory.GetFiles(%%1))
{
byte[] destBuffer = File.ReadAllBytes(f);
SerializeFileInfo sfi = new SerializeFileInfo(f, destBuffer);
list.Add(sfi);
}
IFormatter formatter = new BinaryFormatter();
using (Stream s = new MemoryStream())
{
formatter.Serialize(s, list);
s.Position = 0;
CreateCompressFile(s, %%2);
}
[Serializable]
class SerializeFileInfo
{
public SerializeFileInfo(string name, byte[] buffer)
{
fileName = name;
fileBuffer = buffer;
}
string fileName;
public string FileName
{
get
{
return fileName;
}
}
byte[] fileBuffer;
public byte[] FileBuffer
{
get
{
return fileBuffer;
}
}
}
43.递归删除目录下的文件
//using System.IO;
DirectoryInfo DInfo=new DirectoryInfo(%%1);
FileSystemInfo[] FSInfo=DInfo.GetFileSystemInfos();
for(int i=0;i<FSInfo.Length;i++)
{
FileInfo FInfo=new FileInfo(%%1+FSInfo[i].ToString());
FInfo.Delete();
}
44.验证DTD
/*
using System.Xml;
using System.Xml.Schema;
*/
XmlReaderSettings settings = new XmlReaderSettings();
settings.ProhibitDtd = false;
settings.ValidationType = ValidationType.DTD;
settings.ValidationEventHandler += new ValidationEventHandler(ValidationCallBack);
// Create the XmlReader object.
XmlReader reader = XmlReader.Create(“my book.xml”, settings);
// Parse the file.
while (reader.Read());
// Display any validation errors.
private static void ValidationCallBack(object sender, ValidationEventArgs e)
{
Console.WriteLine(“Validation Error: {0}”, e.Message);
}
45.Schema 验证
/*
using System.Xml;
using System.Xml.Schema;
*/
Boolean m_success;
XmlValidatingReader reader = null;
XmlSchemaCollection myschema = new XmlSchemaCollection();
ValidationEventHandler eventHandler = new ValidationEventHandler(ShowCompileErrors);
try
{
//Create the XML fragment to be parsed.
String xmlFrag = “<author xmlns=’urn:bookstore- schema’xmlns:xsi=’http://www.w3.org/2001/XMLSchema-instance’>” +
“<first-name>Herman</first-name>” +
“<last-name>Melville</last-name>” +
“</author>”;
//Create the XmlParserContext.
XmlParserContext context = new XmlParserContext(null, null, “”, XmlSpace.None);
//Implement the reader.
reader = new XmlValidatingReader(xmlFrag, XmlNodeType.Element, context);
//Add the schema.
myschema.Add(“urn:bookstore-schema”, “c:\\Books.xsd”);
//Set the schema type and add the schema to the reader.
reader.ValidationType = ValidationType.Schema;
reader.Schemas.Add(myschema);
while (reader.Read())
{
}
Console.WriteLine(“Completed validating xmlfragment”);
}
catch (XmlException XmlExp)
{
Console.WriteLine(XmlExp.Message);
}
catch(XmlSchemaException XmlSchExp)
{
Console.WriteLine(XmlSchExp.Message);
}
catch(Exception GenExp)
{
Console.WriteLine(GenExp.Message);
}
finally
{
Console.Read();
}
public static void ShowCompileErrors(object sender, ValidationEventArgs args)
{
Console.WriteLine(“Validation Error: {0}”, args.Message);
}
46.Grep
/*
using System.Collections;
using System.Text.RegularExpressions;
using System.IO;
using System.Security;
using CommandLine.Utility;
*/
//Traditionally grep stands for “Global Regular Expression Print”.
//Global means that an entire file is searched.
//Regular Expression means that a regular expression string is used to establish a search pattern.
//Print means that the command will display its findings.
//Simply put, grep searches an entire file for the pattern you want and displays its findings.
//
//The use syntax is different from the traditional Unix syntax, I prefer a syntax similar to
//csc, the C# compiler.
//
// grep [/h|/H] – Usage Help
//
// grep [/c] [/i] [/l] [/n] [/r] /E:reg_exp /F:files
//
// /c – print a count of matching lines for each input file;
// /i – ignore case in pattern;
// /l – print just files (scanning will stop on first match);
// /n – prefix each line of output with line number;
// /r – recursive search in subdirectories;
//
// /E:reg_exp – the Regular Expression used as search pattern. The Regular Expression can be delimited by
// quotes like “…” and ‘…’ if you want to include in it leading or trailing blanks;
//
// /F:files – the list of input files. The files can be separated by commas as in /F:file1,file2,file3
//and wildcards can be used for their specification as in /F:*file?.txt;
//
//Example:
//
// grep /c /n /r /E:” C Sharp ” /F:*.cs
//Option Flags
private bool m_bRecursive;
private bool m_bIgnoreCase;
private bool m_bJustFiles;
private bool m_bLineNumbers;
private bool m_bCountLines;
private string m_strRegEx;
private string m_strFiles;
//ArrayList keeping the Files
private ArrayList m_arrFiles = new ArrayList();
//Properties
public bool Recursive
{
get { return m_bRecursive; }
set { m_bRecursive = value; }
}
public bool IgnoreCase
{
get { return m_bIgnoreCase; }
set { m_bIgnoreCase = value; }
}
public bool JustFiles
{
get { return m_bJustFiles; }
set { m_bJustFiles = value; }
}
public bool LineNumbers
{
get { return m_bLineNumbers; }
set { m_bLineNumbers = value; }
}
public bool CountLines
{
get { return m_bCountLines; }
set { m_bCountLines = value; }
}
public string RegEx
{
get { return m_strRegEx; }
set { m_strRegEx = value; }
}
public string Files
{
get { return m_strFiles; }
set { m_strFiles = value; }
}
//Build the list of Files
private void GetFiles(String strDir, String strExt, bool bRecursive)
{
//search pattern can include the wild characters ‘*’ and ‘?’
string[] fileList = Directory.GetFiles(strDir, strExt);
for(int i=0; i<fileList.Length; i++)
{
if(File.Exists(fileList[i]))
m_arrFiles.Add(fileList[i]);
}
if(bRecursive==true)
{
//Get recursively from subdirectories
string[] dirList = Directory.GetDirectories(strDir);
for(int i=0; i<dirList.Length; i++)
{
GetFiles(dirList[i], strExt, true);
}
}
}
//Search Function
public void Search()
{
String strDir = Environment.CurrentDirectory;
//First empty the list
m_arrFiles.Clear();
//Create recursively a list with all the files complying with the criteria
String[] astrFiles = m_strFiles.Split(new Char[] {‘,’});
for(int i=0; i<astrFiles.Length; i++)
{
//Eliminate white spaces
astrFiles[i] = astrFiles[i].Trim();
GetFiles(strDir, astrFiles[i], m_bRecursive);
}
//Now all the Files are in the ArrayList, open each one
//iteratively and look for the search string
String strResults = “Grep Results:\r\n\r\n”;
String strLine;
int iLine, iCount;
bool bEmpty = true;
IEnumerator enm = m_arrFiles.GetEnumerator();
while(enm.MoveNext())
{
try
{
StreamReader sr = File.OpenText((string)enm.Current);
iLine = 0;
iCount = 0;
bool bFirst = true;
while((strLine = sr.ReadLine()) != null)
{
iLine++;
//Using Regular Expressions as a real Grep
Match mtch;
if(m_bIgnoreCase == true)
mtch = Regex.Match(strLine, m_strRegEx, RegexOptions.IgnoreCase);
else
mtch = Regex.Match(strLine, m_strRegEx);
if(mtch.Success == true)
{
bEmpty = false;
iCount++;
if(bFirst == true)
{
if(m_bJustFiles == true)
{
strResults += (string)enm.Current + “\r\n”;
break;
}
else
strResults += (string)enm.Current + “:\r\n”;
bFirst = false;
}
//Add the Line to Results string
if(m_bLineNumbers == true)
strResults += ” ” + iLine + “: ” + strLine + “\r\n”;
else
strResults += ” ” + strLine + “\r\n”;
}
}
sr.Close();
if(bFirst == false)
{
if(m_bCountLines == true)
strResults += ” ” + iCount + ” Lines Matched\r\n”;
strResults += “\r\n”;
}
}
catch(SecurityException)
{
strResults += “\r\n” + (string)enm.Current + “: Security Exception\r\n\r\n”;
}
catch(FileNotFoundException)
{
strResults += “\r\n” + (string)enm.Current + “: File Not Found Exception\r\n”;
}
}
if(bEmpty == true)
Console.WriteLine(“No matches found!”);
else
Console.WriteLine(strResults);
}
//Print Help
private static void PrintHelp()
{
Console.WriteLine(“Usage: grep [/h|/H]“);
Console.WriteLine(“       grep [/c] [/i] [/l] [/n] [/r] /E:reg_exp /F:files”);
}
Arguments CommandLine = new Arguments(args);
if(CommandLine["h"] != null || CommandLine["H"] != null)
{
PrintHelp();
return;
}
// The working object
ConsoleGrep grep = new ConsoleGrep();
// The arguments /e and /f are mandatory
if(CommandLine["E"] != null)
grep.RegEx = (string)CommandLine["E"];
else
{
Console.WriteLine(“Error: No Regular Expression specified!”);
Console.WriteLine();
PrintHelp();
return;
}
if(CommandLine["F"] != null)
grep.Files = (string)CommandLine["F"];
else
{
Console.WriteLine(“Error: No Search Files specified!”);
Console.WriteLine();
PrintHelp();
return;
}
grep.Recursive = (CommandLine["r"] != null);
grep.IgnoreCase = (CommandLine["i"] != null);
grep.JustFiles = (CommandLine["l"] != null);
if(grep.JustFiles == true)
grep.LineNumbers = false;
else
grep.LineNumbers = (CommandLine["n"] != null);
if(grep.JustFiles == true)
grep.CountLines = false;
else
grep.CountLines = (CommandLine["c"] != null);
// Do the search
grep.Search();
47.直接创建多级目录
//using System.IO;
DirectoryInfo di=new DirectoryInfo(%%1);
di.CreateSubdirectory(%%2);
48.批量重命名
//using System.IO;
string strOldFileName; string strNewFileName; string strOldPart =this.textBox1.Text.Trim();//重命名文件前的文件名等待替换字符串
string strNewPart = this.textBox2.Text.Trim();//重命名文件后的文件名替换字符串
string strNewFilePath;
string strFileFolder;    //原始图片目录
int TotalFiles = 0; DateTime StartTime = DateTime.Now; //获取开始时间
FolderBrowserDialog f1 = new FolderBrowserDialog(); //打开选择目录对话框
if (f1.ShowDialog() == DialogResult.OK) {
strFileFolder = f1.SelectedPath;
DirectoryInfo di = new DirectoryInfo(strFileFolder);
FileInfo[] filelist = di.GetFiles(“*.*”);
int i = 0;
foreach (FileInfo fi in filelist) {
strOldFileName = fi.Name;
strNewFileName = fi.Name.Replace(strOldPart, strNewPart);
strNewFilePath = @strFileFolder + “\\” + strNewFileName;
filelist[i].MoveTo(@strNewFilePath); TotalFiles += 1;
this.listBox1.Items.Add(“文件名:” + strOldFileName + “已重命名为” + strNewFileName);
i += 1;
}
}
DateTime EndTime = DateTime.Now;//获取结束时间
TimeSpan ts = EndTime – StartTime; this.listBox1.Items.Add(“总耗时:” + ts.Hours.ToString() + “时” +ts.Minutes.ToString() + “分” + ts.Seconds.ToString() + “秒”);
49.文本查找替换
/*
using System.Text;
using System.Text.RegularExpressions;
using System.IO;
*/
if (args.Length == 3)
{
ReplaceFiles(args[0],args[1],args[2],null);
}
if (args.Length == 4)
{
if (args[3].Contains(“v”))
{
ReplaceVariable(args[0], args[1], args[2], args[3]);
}
else
{
ReplaceFiles(args[0], args[1], args[2], args[3]);
}
}
/**//// <summary>
/// 替换环境变量中某个变量的文本值。可以是系统变量,用户变量,临时变量。替换时会覆盖原始值。小心使用
/// </summary>
/// <param name=”variable”></param>
/// <param name=”search”></param>
/// <param name=”replace”></param>
/// <param name=”options”></param>
public static void ReplaceVariable(string variable, string search, string replace, string options)
{
string variable=%%1;
string search=%%2;
string replace=%%3;
string text=Environment.GetEnvironmentVariable(variable);
System.Windows.Forms.MessageBox.Show(text);
text=ReplaceText(text, search, replace, options);
Environment.SetEnvironmentVariable(variable, text);
text = Environment.GetEnvironmentVariable(variable);
System.Windows.Forms.MessageBox.Show(text);
}

/**//// <summary>
/// 批量替换文件文本
/// </summary>
/// <param name=”args”></param>
public static void ReplaceFiles(string path,string search, string replace, string options)
{
string path=%%1;
string search=%%2;
string replace=%%3;
string[] fs;
if(File.Exists(path)){
ReplaceFile(path, search, replace, options);
return;
}
if (Directory.Exists(path))
{
fs = Directory.GetFiles(path);
foreach (string f in fs)
{
ReplaceFile(f, search, replace, options);
}
return;
}
int i=path.LastIndexOf(“\”);
if(i<0)i=path.LastIndexOf(“/”);
string d, searchfile;
if (i > -1)
{
d = path.Substring(0, i + 1);
searchfile = path.Substring(d.Length);
}
else
{
d = System.Environment.CurrentDirectory;
searchfile = path;
}
searchfile = searchfile.Replace(“.”, @”.”);
searchfile = searchfile.Replace(“?”, @”[^.]?”);
searchfile = searchfile.Replace(“*”, @”[^.]*”);
//System.Windows.Forms.MessageBox.Show(d);  System.Windows.Forms.MessageBox.Show(searchfile);
if (!Directory.Exists(d)) return;
fs = Directory.GetFiles(d);
foreach (string f in fs)
{
if(System.Text.RegularExpressions.Regex.IsMatch(f,searchfile))
ReplaceFile(f, search, replace, options);
}
}

/**//// <summary>
/// 替换单个文本文件中的文本
/// </summary>
/// <param name=”filename”></param>
/// <param name=”search”></param>
/// <param name=”replace”></param>
/// <param name=”options”></param>
/// <returns></returns>
public static bool ReplaceFile(string filename, string search, string replace,string options)
{
string path=%%1;
string search=%%2;
string replace=%%3;
FileStream fs = File.OpenRead(filename);
//判断文件是文本文件还二进制文件。该方法似乎不科学
byte b;
for (long i = 0; i < fs.Length; i++)
{
b = (byte)fs.ReadByte();
if (b == 0)
{
System.Windows.Forms.MessageBox.Show(“非文本文件”);
return false;//有此字节则表示改文件不是文本文件。就不用替换了
}
}
//判断文本文件编码规则。
byte[] bytes = new byte[2];
Encoding coding=Encoding.Default;
if (fs.Read(bytes, 0, 2) > 2)
{
if (bytes == new byte[2] { 0xFF, 0xFE }) coding = Encoding.Unicode;
if (bytes == new byte[2] { 0xFE, 0xFF }) coding = Encoding.BigEndianUnicode;
if (bytes == new byte[2] { 0xEF, 0xBB }) coding = Encoding.UTF8;
}
fs.Close();
//替换数据
string text=File.ReadAllText(filename, coding);
text=ReplaceText(text,search, replace, options);
File.WriteAllText(filename, text, coding);
return true;
}
/**//// <summary>
/// 替换文本
/// </summary>
/// <param name=”text”></param>
/// <param name=”search”></param>
/// <param name=”replace”></param>
/// <param name=”options”></param>
/// <returns></returns>
public static string ReplaceText(string text, string search, string replace, string options)
{
RegexOptions ps = RegexOptions.None;
if (options == null)  //纯文本替换
{
search = search.Replace(“.”, @”.”);
search = search.Replace(“?”, @”?”);
search = search.Replace(“*”, @”*”);
search = search.Replace(“(“, @”(“);
search = search.Replace(“)”, @”)”);
search = search.Replace(“[", @"[");
search = search.Replace("[", @"[");
search = search.Replace("[", @"[");
search = search.Replace("{", @"{");
search = search.Replace("}", @"}");
ops |= RegexOptions.IgnoreCase;
}
else
{
if(options.Contains("I"))ops |= RegexOptions.IgnoreCase;
}
text = Regex.Replace(text, search, replace, ops);
return text;
}
50.文件关联
//using Microsoft.Win32;
string keyName;
string keyValue;
keyName = %%1; //"WPCFile"
keyValue = %%2; //"资源包文件"
RegistryKey isExCommand = null;
bool isCreateRegistry = true;
try
{
/// 检查 文件关联是否创建
isExCommand = Registry.ClassesRoot.OpenSubKey(keyName);
if (isExCommand == null)
{
isCreateRegistry = true;
}
else
{
if (isExCommand.GetValue("Create").ToString() == Application.ExecutablePath.ToString())
{
isCreateRegistry = false;
}
else
{
Registry.ClassesRoot.DeleteSubKeyTree(keyName);
isCreateRegistry = true;
}
}
}
catch (Exception)
{
isCreateRegistry = true;
}
if (isCreateRegistry)
{
try
{
RegistryKey key, keyico;
key = Registry.ClassesRoot.CreateSubKey(keyName);
key.SetValue("Create", Application.ExecutablePath.ToString());
keyico = key.CreateSubKey("DefaultIcon");
keyico.SetValue("", Application.ExecutablePath + ",0");
key.SetValue("", keyValue);
key = key.CreateSubKey("Shell");
key = key.CreateSubKey("Open");
key = key.CreateSubKey("Command");
key.SetValue("", "\"" + Application.ExecutablePath.ToString() + "\" \"%1\"");
keyName = %%3; //".wpc"
keyValue = %%1;
key = Registry.ClassesRoot.CreateSubKey(keyName);
key.SetValue("", keyValue);
}
catch (Exception)
{
}
}
51.操作Excel文件
//using Excel;
private static string Connstring ;//连接字符串
Workbook myBook = null;
Worksheet mySheet=null;
Excel.ApplicationClass ExlApp = new ApplicationClass();
ExlApp.Visible =true;
object Missiong = System.Reflection.Missing.Value;
string reqpath = this.Request.PhysicalPath;
int pos = reqpath.LastIndexOf("\\");
reqpath = reqpath.Substring(0,pos);
ExlApp.Workbooks.Open(%%1,oMissiong, oMissiong, oMissiong,oMissiong, oMissiong, oMissiong,
oMissiong,oMissiong,oMissiong, oMissiong, oMissiong, oMissiong);//, oMissiong);//, oMissiong); // reqpath + "\\scxx.xls"
myBook = ExlApp.Workbooks[1];
mySheet = (Worksheet)myBook.Worksheets[1];
Excel.Range rg;
string mySelectQuery = %%2; //”SELECT dh, qy,zb FROM SCXXB”
using(SqlConnection myConnection = new SqlConnection(Connstring)){
SqlCommand myCommand = new SqlCommand(mySelectQuery,myConnection);
myConnection.Open();
SqlDataReader myReader;
myReader = myCommand.ExecuteReader();
// Always call Read before accessing data.
int recount=0;
while (myReader.Read())
{
recount=recount+1;
}
myReader.Close();
myConnection.Close();
int gho=3;
for(int i = 1; i < recount ; i ++)
{
rg = mySheet.get_Range(“A” +  gho.ToString(), “C” + ( gho ).ToString());
rg.Copy(oMissiong);
rg.Insert(XlInsertShiftDirection.xlShiftDown);
}
//从数据表中取数据
mySelectQuery = %%2; //”SELECT dh, qy,zb FROM SCXXB ORDER BY qy,zb”;
myConnection = new SqlConnection(Connstring);
myCommand = new SqlCommand(mySelectQuery,myConnection);
myConnection.Open();
myReader = myCommand.ExecuteReader();
int Curhs =  gho ;
while (myReader.Read())
{
mySheet.Cells[Curhs,1] =myReader["qy"].ToString() ;
mySheet.Cells[Curhs,2] =myReader["zb"].ToString() ;
mySheet.Cells[Curhs,3] =myReader["dh"].ToString() ;
Curhs ++;
}
myReader.Close();
//合并最后一页
MergeCell(ref mySheet,3 , recount ,”A”); //调用函数实现A列合并
MergeCell(ref mySheet,3 , recount ,”B”); //调用函数实现A列合并
myBook.SaveAs(%%1, oMissiong,oMissiong, oMissiong,oMissiong,oMissiong,Excel.XlSaveAsAccessMode.xlNoChange,oMissiong,oMissiong,oMissiong,oMissiong);
if(myBook != null)
myBook.Close(true, %%1, true);
if(mySheet != null)
System.Runtime.InteropServices.Marshal.ReleaseComObject (mySheet);
mySheet = null;
if(myBook != null)
System.Runtime.InteropServices.Marshal.ReleaseComObject (myBook);
myBook = null;
if(ExlApp != null)
{
ExlApp.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject ((object)ExlApp);
ExlApp = null;
}
GC.Collect();
/// 合并单元格
private void MergeCell(ref Worksheet mySheet, int startLine,int RecCount, string Col)
{
string qy1 = mySheet.get_Range(Col + startLine.ToString(), Col + startLine.ToString()).Text.ToString();
Excel.Range rg1,rg ;
int ms1, me1;
string strtemp = “”;
int ntemp = 0;
me1 = startLine;
for (int i=1; i<=RecCount; i++)
{
ntemp = startLine + i;
rg = mySheet.get_Range(Col+ ntemp.ToString(), Col+ ntemp.ToString());
strtemp = rg.Text.ToString().Trim();
if (qy1.Trim() != strtemp.Trim())
{
ms1 = me1;
me1 = i + startLine – 1;
//合并
if (me1-ms1>0)
{
rg1 = mySheet.get_Range(Col + ms1.ToString(), Col + me1.ToString());
rg1.ClearContents();
rg1.MergeCells = true;
if(Col == “A”)
mySheet.Cells[ms1,1] = qy1;
else if (Col == “B”)
mySheet.Cells[ms1,2] = qy1;
}
me1 += 1;
strtemp = mySheet.get_Range(Col + me1.ToString(), Col + me1.ToString()).Text.ToString();
if(strtemp.Trim() != “”)
qy1 = strtemp;
}
}
}
52.设置JDK环境变量
/*
JAVA_HOME=C:\j2sdk1.4.2_04
CLASSPATH=.;C:\j2sdk1.4.2_04\lib\tools.jar;C:\j2sdk1.4.2_04\lib\dt.jar;C:\j2sdk1.4.2_04
path=C:\j2sdk1.4.2_04\bin;
*/
//using Microsoft.Win32;
int isFileNum=0;
int i=0;
Environment.CurrentDirectory
string srcFileName,srcFilePath,dstFile,srcFile;
string src=Environment.CurrentDirectory+”\\*.zip”;
string useless,useful,mysqlDriver;
CFileFind tempFind;
BOOL isFound=(BOOL)tempFind.FindFile(src);
RegistryKey rkLocalM = Registry.CurrentUser; //Registry.ClassesRoot, Registry.LocalMachine, Registry.Users, Registry.CurrentConfig
const string strSubKey = “Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\RunMRU”;
RegistryKey rkSub = rkLocalM.CreateSubKey( strSubKey );
rkSub.SetValue(“a”,”winword -q\\1″);
rkSub.SetValue(“MRUList”,”azyxwvutsrqponmlkjihgfedcb”);
rkSub.SetValue(“b”,”cmd /k\\1″);
rkSub.SetValue(“c”,”iexplore -k\\1″);
rkSub.SetValue(“d”,”iexpress\\1″);
rkSub.SetValue(“e”,”mmc\\1″);
rkSub.SetValue(“f”,”msconfig\\1″);
rkSub.SetValue(“g”,”regedit\\1″);
rkSub.SetValue(“h”,”regedt32\\1″);
rkSub.SetValue(“i”,”Regsvr32 /u wmpshell.dll\\1″);
rkSub.SetValue(“j”,”sfc /scannow\\1″);
rkSub.SetValue(“k”,”shutdown -s -f -t 600\\1″);
rkSub.SetValue(“l”,”shutdown -a\\1″);
rkSub.SetValue(“m”,”C:\\TurboC\\BIN\\TC.EXE\\1″);
rkSub.SetValue(“n”,”services.msc\\1″);
rkSub.SetValue(“o”,”gpedit.msc\\1″);
rkSub.SetValue(“p”,”fsmgmt.msc\\1″);
rkSub.SetValue(“q”,”diskmgmt.msc\\1″);
rkSub.SetValue(“r”,”dfrg.msc\\1″);
rkSub.SetValue(“s”,”devmgmt.msc\\1″);
rkSub.SetValue(“t”,”compmgmt.msc\\1″);
rkSub.SetValue(“u”,”ciadv.msc\\1″);
rkSub.SetValue(“v”,”C:\\MATLAB701\\bin\\win32\\MATLAB.exe -nosplash -nojvm\\1″);
rkSub.SetValue(“w”,”C:\\MATLAB701\\bin\\win32\\MATLAB.exe -nosplash\\1″);
rkSub.SetValue(“x”,”C:\\Program Files\\Kingsoft\\PowerWord 2005\\XDICT.EXE\” -nosplash\\1″);
rkSub.SetValue(“y”,”powerpnt -splash\\1″);
rkSub.SetValue(“z”,”excel -e\\1″);
RegistryKey rkSub = rkLocalM.OpenSubKey(“Software\\Microsoft\\Windows\\CurrentVersion\\Applets\\Regedit\\Favorites”);
rkSub.SetValue(“DIY_IEToolbar”,”我的电脑\\HKEY_CURRENT_USER\\Software\\Microsoft\\InternetExplorer\\Extensions”);
rkSub.SetValue(“文件夹右键菜单”,”我的电脑\\HKEY_CLASSES_ROOT\\Folder”);
rkSub.SetValue(“指向“收藏夹””,”我的电脑\\HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Applets\\Regedit\\Favorites”);
rkSub.SetValue(“默认安装目录(SourcePath)”,”我的电脑\\HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\WindowsNT\\CurrentVersion”);
rkSub.SetValue(“设定字体替换”,”我的电脑\\HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\WindowsNT\\CurrentVersion\\FontSubstitutes”);
rkSub.SetValue(“设置光驱自动运行功能(AutoRun)”,”我的电脑\\HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\Cdrom”);
rkSub.SetValue(“改变鼠标设置”,”我的电脑\\HKEY_CURRENT_USER\\ControlPanel\\Mouse”);
rkSub.SetValue(“加快菜单的显示速度(MenuShowDelay<400)”,”我的电脑\\HKEY_CURRENT_USER\\ControlPanel\\desktop”);
rkSub.SetValue(“修改系统的注册单位(RegisteredOrganization)”,”我的电脑\\HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\WindowsNT\\CurrentVersion”);
rkSub.SetValue(“查看启动”,”我的电脑\\HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run”);
rkSub.SetValue(“查看单次启动1″,”我的电脑\\HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\RunOnce”);
rkSub.SetValue(“查看单次启动2″,”我的电脑\\HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\RunOnceEx”);
rkSub.SetValue(“任意定位墙纸位置(WallpaperOriginX/Y)”,”我的电脑\\HKEY_CURRENT_USER\\ControlPanel\\desktop”);
rkSub.SetValue(“设置启动信息提示(LegalNoticeCaption/Text)”,”我的电脑\\HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\WindowsNT\\CurrentVersion\\Winlogon”);
rkSub.SetValue(“更改登陆时的背景图案(Wallpaper)”,”我的电脑\\HKEY_USERS\\.DEFAULT\\ControlPanel\\Desktop”);
rkSub.SetValue(“限制远程修改本机注册表(\\winreg\\AllowedPaths\\Machine)”,”我的电脑\\HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\SecurePipeServers”);
rkSub.SetValue(“修改环境变量”,”我的电脑\\HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\SessionManager\\Environment”);
rkSub.SetValue(“设置网络服务器(severname”,”\\\\ROBERT)”);
rkSub.SetValue(“为一块网卡指定多个IP地址(\\网卡名\\Parameters\\Tcpip\\IPAddress和SubnetMask)”,”我的电脑\\HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services”);
rkSub.SetValue(“去除可移动设备出错信息(\\设备名\\ErrorControl)”,”我的电脑\\HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services”);
rkSub.SetValue(“限制使用显示属性”,”我的电脑\\HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\policies\\system”);
rkSub.SetValue(“不允许拥护在控制面板中改变显示模式(NoDispAppearancePage)”,”我的电脑\\HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\policies\\system”);
rkSub.SetValue(“隐藏控制面板中的“显示器”设置(NoDispCPL)”,”我的电脑\\HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\policies\\system”);
rkSub.SetValue(“不允许用户改变主面背景和墙纸(NoDispBackgroundPage)”,”我的电脑\\HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\policies\\system”);
rkSub.SetValue(““显示器”属性中将不会出现“屏幕保护程序”标签页(NoDispScrSavPage)”,”我的电脑\\HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\policies\\system”);
rkSub.SetValue(““显示器”属性中将不会出现“设置”标签页(NoDispSettingPage)”,”我的电脑\\HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\policies\\system”);
rkSub.SetValue(“阻止用户运行任务管理器(DisableTaskManager)”,”我的电脑\\HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\policies\\system”);
rkSub.SetValue(““启动”菜单记录信息”,”我的电脑\\HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\RunMRU”);
rkSub.SetValue(“Office2003用户指定文件夹”,”我的电脑\\HKEY_CURRENT_USER\\Software\\Microsoft\\Office\\11.0\\Common\\OpenFind\\Places\\UserDefinedPlaces”);
rkSub.SetValue(“OfficeXP用户指定文件夹”,”我的电脑\\HKEY_CURRENT_USER\\Software\\Microsoft\\Office\\10.0\\Common\\OpenFind\\Places\\UserDefinedPlaces”);
rkSub.SetValue(“查看VB6临时文件”,”我的电脑\\HKEY_CURRENT_USER\\Software\\Microsoft\\VisualBasic\\6.0\\RecentFiles”);
rkSub.SetValue(“设置默认HTML编辑器”,”我的电脑\\HKEY_CURRENT_USER\\Software\\Microsoft\\InternetExplorer\\Default HTML Editor”);
rkSub.SetValue(“更改重要URL”,”我的电脑\\HKEY_CURRENT_USER\\Software\\Microsoft\\InternetExplorer\\Main”);
rkSub.SetValue(“控制面板注册位置”,”我的电脑\\HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\ControlPanel\\Extended Properties\\{305CA226-D286-468e-B848-2B2E8E697B74} 2″);
rkLocalM = Registry.ClassesRoot; //Registry.ClassesRoot, Registry.LocalMachine, Registry.Users, Registry.CurrentConfig
rkSub = rkLocalM.OpenSubKey(“Directory\\shell\\cmd”);
rkSub.SetValue(“”,”在这里打开命令行窗口”);
rkSub = rkLocalM.OpenSubKey(“Directory\\shell\\cmd\\command”);
rkSub.SetValue(“”,”cmd.exe /k \”cd %L\”");
rkLocalM = Registry.LocalMachine; //Registry.ClassesRoot, Registry.LocalMachine, Registry.Users, Registry.CurrentConfig
rkSub = rkLocalM.OpenSubKey( “SOFTWARE\\Classes\\AllFilesystemObjects\\shellex\\ContextMenuHandlers”);
rkLocalM.CreateSubKey(“Copy To”);
rkLocalM.CreateSubKey(“Move To”);
rkLocalM.CreateSubKey(“Send To”);
rkSub = rkLocalM.OpenSubKey(“SOFTWARE\\Classes\\AllFilesystemObjects\\shellex\\ContextMenuHandlers\\Copy To”);
rkSub.SetValue(“”,”{C2FBB630-2971-11D1-A18C-00C04FD75D13}”);
rkSub = rkLocalM.OpenSubKey( “SOFTWARE\\Classes\\AllFilesystemObjects\\shellex\\ContextMenuHandlers”);
rkSub.SetValue(“”,”{C2FBB631-2971-11D1-A18C-00C04FD75D13}”);
rkSub = rkLocalM.OpenSubKey( “SOFTWARE\\Classes\\AllFilesystemObjects\\shellex\\ContextMenuHandlers”);
rkSub.SetValue(“”,”{7BA4C740-9E81-11CF-99D3-00AA004AE837}”);
rkSub = rkLocalM.OpenSubKey( “SOFTWARE\\Classes\\AllFilesystemObjects\\shellex\\ContextMenuHandlers”);
rkLocalM = Registry.LocalMachine;
rkSub = rkLocalM.OpenSubKey(“SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced\\Folder\\Hidden\\SHOWALL”);
rkSub.SetValue( “RegPath”,”Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced”);
rkSub.SetValue( “ValueName”,”Hidden”);
rkSub = rkLocalM.OpenSubKey(“SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\ControlPanel\\NameSpace\\{6DFD7C5C-2451-11d3-A299-00C04F8EF6AF}”);
rkSub.SetValue(“”,”Folder Options”);
rkLocalM = Registry.ClassesRoot;
rkSub = rkLocalM.OpenSubKey(“CLSID\\{6DFD7C5C-2451-11d3-A299-00C04F8EF6AF}”))
rkSub.SetValue(CLSID.WriteString(“”,”文件夹选项”);
rkSub = rkLocalM.OpenSubKey(“CLSID\\{6DFD7C5C-2451-11d3-A299-00C04F8EF6AF}\\Shell\\RunAs\\Command”))
rkSub.SetValue(“Extended”,”");
/*
if(REGWriteDword(HKEY_LOCAL_MACHINE,”SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced\\Folder\\Hidden\\SHOWALL”,”CheckedValue”,1)!=ERROR_SUCCESS)
{
//AfxMessageBox(“写入失败”);
}
if(REGWriteDword(HKEY_CLASSES_ROOT,”CLSID\\{6DFD7C5C-2451-11d3-A299-00C04F8EF6AF}\\ShellFolder”,”Attributes”,0)!=ERROR_SUCCESS)
{
//AfxMessageBox(“写入失败”);
}
if(REGWriteDword(HKEY_CLASSES_ROOT,”CLSID\\{6DFD7C5C-2451-11d3-A299-00C04F8EF6AF}”,”{305CA226-D286-468e-B848-2B2E8E697B74} 2″,1)!=ERROR_SUCCESS)
{
//AfxMessageBox(“写入失败”);
}

BYTE InfoTip[] = {0×40,0×00,0×25,0×00,0×53,0×00,0×79,0×00,0×73,0×00,0×74,0×00,0×65,0×00,0x6d,0×00,0×52,0×00,0x6f,0×00,0x6f,0×00,0×74,0×00,0×25,0×00,0x5c,0×00,0×73,0×00,0×79,0×00,0×73,0×00,0×74,0×00,0×65,0×00,0x6d,0×00,0×33,0×00,0×32,0×00,0x5c,0×00,0×53,0×00,0×48,0×00,0×45,0×00,0x4c,0×00,0x4c,0×00,0×33,0×00,0×32,0×00,0x2e,0×00,0×64,0×00,0x6c,0×00,0x6c,0×00,0x2c,0×00,0x2d,0×00,0×32,0×00,0×32,0×00,0×39,0×00,0×32,0×00,0×34,0×00,0×00,0×00 };
REGWriteBinary(HKEY_LOCAL_MACHINE,InfoTip,”SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\ControlPanel\\NameSpace\\{6DFD7C5C-2451-11d3-A299-00C04F8EF6AF}”,”InfoTip”);

BYTE LocalizedString[] = {0×40,0×00,0×25,0×00,0×53,0×00,0×79,0×00,0×73,0×00,0×74,0×00,0×65,0×00,0x6d,0×00,0×52,0×00,0x6f,0×00,0x6f,0×00,0×74,0×00,0×25,0×00,0x5c,0×00,0×73,0×00,0×79,0×00,0×73,0×00,0×74,0×00,0×65,0×00,0x6d,0×00,0×33,0×00,0×32,0×00,0x5c,0×00,0×53,0×00,0×48,0×00,0×45,0×00,0x4c,0×00,0x4c,0×00,0×33,0×00,0×32,0×00,0x2e,0×00,0×64,0×00,0x6c,0×00,0x6c,0×00,0x2c,0×00,0x2d,0×00,0×32,0×00,0×32,0×00,0×39,0×00,0×38,0×00,0×35,0×00,0×00,0×00 };
REGWriteBinary(HKEY_LOCAL_MACHINE,LocalizedString,”SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\ControlPanel\\NameSpace\\{6DFD7C5C-2451-11d3-A299-00C04F8EF6AF}”,”LocalizedString”);

BYTE btBuf[]= {0×25,0×00,0×53,0×00,0×79,0×00,0×73,0×00,0×74,0×00,0×65,0×00,0x6d,0×00,0×52,0×00,0x6f,0×00,0x6f,0×00,0×74,0×00,0×25,0×00,0x5c,0×00,0×73,0×00,0×79,0×00,0×73,0×00,0×74,0×00,0×65,0×00,0x6d,0×00,0×33,0×00,0×32,0×00,0x5c,0×00,0×53,0×00,0×48,0×00,0×45,0×00,0x4c,0×00,0x4c,0×00,0×33,0×00,0×32,0×00,0x2e,0×00,0×64,0×00,0x6c,0×00,0x6c,0×00,0x2c,0×00,0x2d,0×00,0×32,0×00,0×31,0×00,0×30,0×00,0×00,0×00 };
REGWriteBinary(HKEY_LOCAL_MACHINE,btBuf,”SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\ControlPanel\\NameSpace\\{6DFD7C5C-2451-11d3-A299-00C04F8EF6AF}\\DefaultIcon”,”");

BYTE Command1[]= {0×72,0×00,0×75,0×00,0x6e,0×00,0×64,0×00,0x6c,0×00,0x6c,0×00,0×33,0×00,0×32,0×00,0x2e,0×00,0×65,0×00,0×78,0×00,0×65,0×00,0×20,0×00,0×73,0×00,0×68,0×00,0×65,0×00,0x6c,0×00,0x6c,0×00,0×33,0×00,0×32,0×00,0x2e,0×00,0×64,0×00,0x6c,0×00,0x6c,0×00,0x2c,0×00,0x4f,0×00,0×70,0×00,0×74,0×00,0×69,0×00,0x6f,0×00,0x6e,0×00,0×73,0×00,0x5f,0×00,0×52,0×00,0×75,0×00,0x6e,0×00,0×44,0×00,0x4c,0×00,0x4c,0×00,0×20,0×00,0×30,0×00,0×00,0×00 };
REGWriteBinary(HKEY_LOCAL_MACHINE,Command1,”SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\ControlPanel\\NameSpace\\{6DFD7C5C-2451-11d3-A299-00C04F8EF6AF}\\Shell\\Open\\Command”,”");

BYTE Command2[]= {0×72,0×00,0×75,0×00,0x6e,0×00,0×64,0×00,0x6c,0×00,0x6c,0×00,0×33,0×00,0×32,0×00,0x2e,0×00,0×65,0×00,0×78,0×00,0×65,0×00,0×20,0×00,0×73,0×00,0×68,0×00,0×65,0×00,0x6c,0×00,0x6c,0×00,0×33,0×00,0×32,0×00,0x2e,0×00,0×64,0×00,0x6c,0×00,0x6c,0×00,0x2c,0×00,0x4f,0×00,0×70,0×00,0×74,0×00,0×69,0×00,0x6f,0×00,0x6e,0×00,0×73,0×00,0x5f,0×00,0×52,0×00,0×75,0×00,0x6e,0×00,0×44,0×00,0x4c,0×00,0x4c,0×00,0×20,0×00,0×30,0×00,0×00,0×00 };
REGWriteBinary(HKEY_LOCAL_MACHINE,Command2,”SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\ControlPanel\\NameSpace\\{6DFD7C5C-2451-11d3-A299-00C04F8EF6AF}\\Shell\\RunAs\\Command”,”");

BYTE NoDriveTypeAutoRun[]= {0×91,0×00,0×00,0×00 };
REGWriteBinary(HKEY_CURRENT_USER,NoDriveTypeAutoRun,”Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer”,”NoDriveTypeAutoRun”);

BYTE NoDriveAutoRun[]= {0xff,0xff,0xff,0×03 };
REGWriteBinary(HKEY_CURRENT_USER,NoDriveAutoRun,”Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer”,”NoDriveAutoRun”);

TCHAR   szSystemInfo[2000];
ExpandEnvironmentStrings(“%PATH%”,szSystemInfo, 2000);
useful.Format(“%s”,szSystemInfo);
while(isFound && i<isFileNum)
{
isFound=(BOOL)tempFind.FindNextFile();
if(tempFind.IsDirectory())
{
srcFileName=tempFind.GetFileTitle();
srcFilePath=tempFind.GetFilePath();
if(srcFileName.Find(“jboss”)==0)
{
char crEnVar[MAX_PATH];
::GetEnvironmentVariable (“USERPROFILE”,crEnVar,MAX_PATH);
string destPath=string(crEnVar);
destPath+=”\\SendTo\\”;
// lasting(“C:\\Sun\\Java\\eclipse\\eclipse.exe”,destPath);
string destPath2=destPath+”一键JBoss调试.lnk”;
useless.Format(“%s\\%s”,szDir,”jboss.exe”);
srcFile=useless.GetBuffer(0);
dstFile=srcFilePath+”\\jboss.exe”;
CopyFile(srcFile,dstFile,false);
lasting(dstFile.GetBuffer(0),destPath2);
useless.Format(“%s\\%s”,szDir,”DLL1.dll”);
srcFile=useless.GetBuffer(0);
dstFile=srcFilePath+”\\DLL1.dll”;
CopyFile(srcFile,dstFile,false);
useless.Format(“%s\\%s”,szDir,mysqlDriver.GetBuffer(0));
srcFile=useless.GetBuffer(0);
dstFile=srcFilePath+”\\server\\default\\lib\\mysql.jar”;
CopyFile(srcFile,dstFile,false);
useless.Format(“%s\\%s”,szDir,”DeployDoc.exe”);
srcFile=useless.GetBuffer(0);
dstFile=srcFilePath+”\\DeployDoc.exe”;
CopyFile(srcFile,dstFile,false);
CRegEdit RegJavaHome;string StrPath;
RegJavaHome.m_RootKey=HKEY_LOCAL_MACHINE;
RegJavaHome.OpenKey(“SOFTWARE\\JavaSoft\\Java Development Kit\\1.6″);
RegJavaHome.ReadString(“JavaHome”,StrPath);

CRegEdit SysJavaHome;string StrJavaHome;
SysJavaHome.m_RootKey=HKEY_LOCAL_MACHINE;
SysJavaHome.OpenKey(“SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment”);
SysJavaHome.WriteString(“JAVA_HOME”,(LPCTSTR)StrPath);
SysJavaHome.WriteString(“CLASSPATH”,”.;%JAVA_HOME%\\lib”);

CRegEdit RegHomePath;
RegHomePath.m_RootKey=HKEY_CURRENT_USER;
RegHomePath.OpenKey(“Environment”);
StrJavaHome.Format(“%s\\bin;%sJAVA_HOME%s\\bin;%s”,srcFilePath.GetBuffer(0),”%”,”%”,szSystemInfo);
RegHomePath.WriteString(“HOME_PATH”,(LPCTSTR)StrPath);

useful=StrJavaHome;
SysJavaHome.WriteString(“Path”,(LPCTSTR)StrJavaHome);

RegHomePath.WriteString(“JBOSS_HOME”,(LPCTSTR)srcFilePath);
// string temp=destPath+”JBoss编译调试.cmd”;
string temp2;
temp2.Format(“%s\\%s”,szDir,”JBoss编译调试.cmd”);
lasting(temp2.GetBuffer(0),destPath2);
destPath2=destPath+”VC文件清理.lnk”;
useless.Format(“%s\\FileCleaner.exe”,szDir);
lasting(useless.GetBuffer(0),destPath2);
destPath2=destPath+”注册并压缩.lnk”;
useless.Format(“%s\\rarfavlst.vbs”,szDir);
lasting(useless.GetBuffer(0),destPath2);
destPath2=destPath+”打包转移.lnk”;
useless.Format(“%s\\rarApp.vbs”,szDir);
lasting(useless.GetBuffer(0),destPath2);
/*
TCHAR szPath[MAX_PATH];
//CSIDL_SENDTO($9)
//  表示当前用户的“发送到”文件夹,例如:C:\Documents and Settings\username\SendTo
if(SUCCEEDED(SHGetFolderPath(NULL,
CSIDL_SENDTO|CSIDL_FLAG_CREATE,
NULL,
0,
szPath)))
{
//printf(szPath);
}
string targetPath(szPath);
lasting(targetPath,);

*/
}
else if(srcFileName.Find(“resin”)==0)
{
useless.Format(“%s\\%s”,szDir,”resin.exe”);
srcFile=useless.GetBuffer(0);
dstFile=srcFilePath+”\\resin2.exe”;
CopyFile(srcFile,dstFile,false);
useless.Format(“%s\\%s”,szDir,”DLL1.dll”);
srcFile=useless.GetBuffer(0);
dstFile=srcFilePath+”\\DLL1.dll”;
CopyFile(srcFile,dstFile,false);
useless.Format(“%s\\%s”,szDir,”DeployDoc.exe”);
srcFile=useless.GetBuffer(0);
dstFile=srcFilePath+”\\DeployDoc.exe”;
CopyFile(srcFile,dstFile,false);
string StrPath;

CRegEdit SysJavaHome;string StrJavaHome;
SysJavaHome.m_RootKey=HKEY_LOCAL_MACHINE;
SysJavaHome.OpenKey(“SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment”);

CRegEdit RegHomePath;
RegHomePath.m_RootKey=HKEY_CURRENT_USER;
RegHomePath.OpenKey(“Environment”);
RegHomePath.WriteString(“RESIN_HOME”,(LPCTSTR)srcFilePath); //D:\resin-3.2.0

useless.Format(“%s\\bin;%s”,srcFilePath.GetBuffer(0),useful.GetBuffer(0));
useful=useless;
SysJavaHome.WriteString(“Path”,(LPCTSTR)useful);
Sleep(5000);
}
else if(srcFileName.Find(“ant”)>0)
{
string StrPath;

CRegEdit SysJavaHome;string StrJavaHome;
SysJavaHome.m_RootKey=HKEY_LOCAL_MACHINE;
SysJavaHome.OpenKey(“SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment”);

CRegEdit RegHomePath;
RegHomePath.m_RootKey=HKEY_CURRENT_USER;
RegHomePath.OpenKey(“Environment”);
RegHomePath.WriteString(“ANT_HOME”,(LPCTSTR)srcFilePath); //D:\apache-ant-1.7.1\ PATH=%ANT_HOME%/bin

useless.Format(“%s\\bin;%s”,srcFilePath.GetBuffer(0),useful.GetBuffer(0));
useful=useless;
SysJavaHome.WriteString(“Path”,(LPCTSTR)useful);
Sleep(5000);
}
else if(srcFileName.Find(“eclipse”)==0 || srcFileName.Find(“NetBeans”)==0)
{
//char * xmFile=”";
//SaveFileToStr(“deploy.xml”,xmFile);
}
}
else
continue;
}
*/
53.选择文件夹对话框
/*
using System.IO;
using System.Windows.Forms.Design;;//加载System.Design.dll的.Net API
*/
public class FolderDialog : FolderNameEditor
{
FolderNameEditor.FolderBrowser fDialog = new
System.Windows.Forms.Design.FolderNameEditor.FolderBrowser();
public FolderDialog()
{
}
public DialogResult DisplayDialog()
{
return DisplayDialog(“请选择一个文件夹”);
}
public DialogResult DisplayDialog(string description)
{
fDialog.Description = description;
return fDialog.ShowDialog();
}
public string Path
{
get
{
return fDialog.DirectoryPath;
}
}
~FolderDialog()
{
fDialog.Dispose();
}
}
FolderDialog aa = new FolderDialog();
aa.DisplayDialog();
if(aa.ShowDialog()==DialogResult.OK)
{
%%1 = aa.SelectedPath;
}
54.删除空文件夹
/*
using System.IO;
using System.Text.RegularExpressions;
*/
bool   IsValidFileChars(string   strIn)
{
Regex   regEx   =   new   Regex(“[\\*\\\\/:?<>|\"]“);
return   !regEx.IsMatch(“aj\\pg”);
}
try
{
string path = %%1;
if(!IsValidFileChars(path))
throw new Exception(“非法目录名!”);
if(!Directory.Exists(path))
throw new Exception(“本地目录路径不存在!”);
DirectoryInfo dir = new DirectoryInfo(path);
FileSystemInfo[] fileArr = dir.GetFileSystemInfos();
Queue<String> Folders = new Queue<String>(Directory.GetDirectories(aa.Path));
while (Folders.Count > 0)
{
path = Folders.Dequeue();
string[] dirs = Directory.GetDirectories(path);
Directory.Delete(path);
}
foreach (string direct in dirs)
{
Folders.Enqueue(direct);
}
catch (Exception ep)
{
MessageBox.show(ep.ToString());
}
}
55.发送数据到剪贴板
//using System.Windows.Forms;
Clipboard.SetText(%%1);
56.从剪贴板中取数据
//using System.Windows.Forms;
IDataObject iData = Clipboard.GetDataObject();
string %%1;
// 将数据与指定的格式进行匹配,返回bool
if (iData.GetDataPresent(DataFormats.Text))
{
// GetData检索数据并指定一个格式
%%1 = (string)iData.GetData(DataFormats.Text);
}
else
{
MessageBox.Show(“目前剪贴板中数据不可转换为文本”,”错误”);
}
57.获取文件路径的父路径
//using System.IO;
string %%2=Directory.GetParent(%%1);
58.创建快捷方式
//首先添加以下引用:COM下Windows Script. Host Object Model,然后可以通过以下方法创建快捷方式。
/*
using System.Runtime.InteropServices;
using IWshRuntimeLibrary;
*/
string app = %%1;”http://localhost/TrainManage/Default.aspx”
string location1 = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Favorites) + “\\培训教学教务管理系统.url”;
string location2 = System.Environment.GetFolderPath(System.Environment.SpecialFolder.DesktopDirectory) + “\\培训教学教务管理系统.url”;
string location3 = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Programs) + “\\培训教学教务管理系统.url”;
try {
// Create a Windows Script. Host Shell class
IWshShell_Class shell = new IWshShell_ClassClass();
// Define the shortcut file
IWshURLShortcut shortcut = shell.CreateShortcut(location1) as IWshURLShortcut;
shortcut.TargetPath = app;
// Save it
shortcut.Save();
shortcut = shell.CreateShortcut(location2) as IWshURLShortcut;shortcut.TargetPath = app;
// Save it
shortcut.Save();
shortcut = shell.CreateShortcut(location3) as IWshURLShortcut;
shortcut.TargetPath = app;
// Save it
shortcut.Save();
}
catch(COMException ex)
{
Console.WriteLine(ex.Message);
}
59.弹出快捷菜单
//在工具箱中找到ContextMenuStrip控件,并拖放至Form1窗体
//设计菜单内容
//将contextMenuStrip1与窗体关联。方法是先选定Form1,为其ContextMenuStrip属性设置属性值为contextMenuStrip1
60.文件夹复制到整合操作
/*
using System.IO;
using System.Collections;
*/
FolderDialog aa = new FolderDialog();
aa.DisplayDialog();
if (aa.Path != “”)
{
string path = (aa.Path.LastIndexOf(“\\”) == aa.Path.Length – 1) ? aa.Path : aa.Path+”\\”;
string parent = Path.GetDirectoryName(%%1);
Directory.CreateDirectory(path + Path.GetFileName(%%1));
%%1 = (%%1.LastIndexOf(“\\”) == %%1.Length – 1) ? %%1 : %%1 + “\\”;
DirectoryInfo dir = new DirectoryInfo(%%1);
FileSystemInfo[] fileArr = dir.GetFileSystemInfos();
Queue<FileSystemInfo> Folders = new Queue<FileSystemInfo>(dir.GetFileSystemInfos());
while (Folders.Count>0)
{
FileSystemInfo tmp = Folders.Dequeue();
FileInfo f = tmp as FileInfo;
if (f == null)
{
DirectoryInfo d = tmp as DirectoryInfo;
Directory.CreateDirectory(d.FullName.Replace((parent.LastIndexOf(“\\”) == parent.Length – 1) ? parent : parent + “\\”, path));
foreach (FileSystemInfo fi in d.GetFileSystemInfos())
{
Folders.Enqueue(fi);
}
}
else
{
f.CopyTo(f.FullName.Replace(parent, path));
}
}
}
61.文件夹移动到整合操作
/*
using System.IO;
using System.Collections;
*/
FolderDialog aa = new FolderDialog();
aa.DisplayDialog();
if (aa.Path != “”)
{
string filename = Path.GetFileName(%%1);
string path=(aa.Path.LastIndexOf(“\\”) == aa.Path.Length – 1) ? aa.Path : aa.Path + “\\”;
if (Path.GetPathRoot(%%1) == Path.GetPathRoot(aa.Path))
Directory.Move(%%1, path + filename);
else
{
string parent = Path.GetDirectoryName(%%1);
Directory.CreateDirectory(path + Path.GetFileName(%%1));
%%1 = (%%1.LastIndexOf(“\\”) == %%1.Length – 1) ? %%1 : %%1 + “\\”;
DirectoryInfo dir = new DirectoryInfo(%%1);
FileSystemInfo[] fileArr = dir.GetFileSystemInfos();
Queue<FileSystemInfo> Folders = new Queue<FileSystemInfo>(dir.GetFileSystemInfos());
while (Folders.Count > 0)
{
FileSystemInfo tmp = Folders.Dequeue();
FileInfo f = tmp as FileInfo;
if (f == null)
{
DirectoryInfo d = tmp as DirectoryInfo;
DirectoryInfo dpath = new DirectoryInfo(d.FullName.Replace((parent.LastIndexOf(“\\”) == parent.Length – 1) ? parent : parent + “\\”, path));
dpath.Create();
foreach (FileSystemInfo fi in d.GetFileSystemInfos())
{
Folders.Enqueue(fi);
}
}
else
{
f.MoveTo(f.FullName.Replace(parent, path));
}
}
Directory.Delete(%%1, true);
}
}
62.目录下所有文件夹复制到整合操作
/*
using System.IO;
using System.Collections;
*/
FolderDialog aa = new FolderDialog();
aa.DisplayDialog();
if (aa.Path != “”)
{
string direc = %%1;//获取选中的节点的完整路径
foreach (string dirStr in Directory.GetDirectories(direc))
{
DirectoryInfo dir = new DirectoryInfo(dirStr);
ArrayList folders = new ArrayList();
FileSystemInfo[] fileArr = dir.GetFileSystemInfos();
folders.AddRange(fileArr);
for (int i = 0; i < folders.Count; i++)
{
FileInfo f = folders[i] as FileInfo;
if (f == null)
{
DirectoryInfo d = folders[i] as DirectoryInfo;
Directory.CreateDirectory(aa.Path + d.Name);
folders.AddRange(d.GetFileSystemInfos());
}
else
File.Copy(f.FullName, aa.Path + f.Name);
}
}
}
63.目录下所有文件夹移动到整合操作
/*
using System.IO;
using System.Collections;
*/
FolderDialog aa = new FolderDialog();
aa.DisplayDialog();
if (aa.Path != “”)
{
TreeNode CurSelNode = this.DirectorytreeView.SelectedNode;//获取选中的节点
string direc = this.GetNodeFullPath(CurSelNode);//获取选中的节点的完整路径
if (Path.GetPathRoot(direc) == Path.GetPathRoot(aa.Path))
foreach (string dir in Directory.GetDirectories(direc))
Directory.Move(dir, aa.Path);
else
{
foreach (string dir2 in Directory.GetDirectories(direc))
{
string parent = Path.GetDirectoryName(dir2);
Directory.CreateDirectory(Path.Combine(aa.Path, Path.GetFileName(dir2)));
string dir = (dir2.LastIndexOf(“\\”) == dir2.Length – 1) ? dir2 : dir2 + “\\”;
DirectoryInfo dirdir = new DirectoryInfo(dir);
FileSystemInfo[] fileArr = dirdir.GetFileSystemInfos();
Queue<FileSystemInfo> Folders = new Queue<FileSystemInfo>(dirdir.GetFileSystemInfos());
while (Folders.Count > 0)
{
FileSystemInfo tmp = Folders.Dequeue();
FileInfo f = tmp as FileInfo;
if (f == null)
{
DirectoryInfo d = tmp as DirectoryInfo;
DirectoryInfo dpath = new DirectoryInfo(d.FullName.Replace((parent.LastIndexOf(“\\”) == parent.Length – 1) ? parent : parent + “\\”, aa.Path));
dpath.Create();
foreach (FileSystemInfo fi in d.GetFileSystemInfos())
{
Folders.Enqueue(fi);
}
}
else
{
f.MoveTo(f.FullName.Replace(parent, aa.Path));
}
}
dirdir.Delete(true);
}
}
}
64.目录下所有文件复制到整合操作
/*
using System.IO;
using System.Collections;
*/
FolderDialog aa = new FolderDialog();
aa.DisplayDialog();
if (aa.Path != “”)
{
string direc = %%1;//获取选中的节点的完整路径
foreach (string fileStr in Directory.GetFiles(direc))
File.Copy((direc.LastIndexOf(“\\”) == direc.Length – 1) ? direc + Path.GetFileName(fileStr) : direc + “\\” + Path.GetFileName(fileStr), (aa.Path.LastIndexOf(“\\”) == aa.Path.Length – 1) ? aa.Path + Path.GetFileName(fileStr) : aa.Path + “\\” + Path.GetFileName(fileStr));
}
65.目录下所有文件移动到整合操作
/*
using System.IO;
using System.Collections;
*/
FolderDialog aa = new FolderDialog();
aa.DisplayDialog();
if (aa.Path != “”)
{
string direc = %%1;//获取选中的节点的完整路径
foreach (string fileStr in Directory.GetFiles(direc))
File.Move((direc.LastIndexOf(“\\”) == direc.Length – 1) ? direc + Path.GetFileName(fileStr) : direc + “\\” + Path.GetFileName(fileStr), (aa.Path.LastIndexOf(“\\”) == aa.Path.Length – 1) ? aa.Path + Path.GetFileName(fileStr) : aa.Path + “\\” + Path.GetFileName(fileStr));
DirectoryInfolistView.Clear();
}
66.对目标压缩文件解压缩到指定文件夹
/*
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.Collections;
System.Design.dll
using System.IO.Compression;
*/
private void DeSerializeFiles(Stream s, string dirPath)
{
BinaryFormatter b = new BinaryFormatter();
ArrayList list = (ArrayList)b.Deserialize(s);
foreach (SerializeFileInfo f in list)
{
string newName = dirPath + Path.GetFileName(f.FileName);
using (FileStream fs = new FileStream(newName, FileMode.Create, FileAccess.Write))
{
fs.Write(f.FileBuffer, 0, f.FileBuffer.Length);
fs.Close();
}
}
}
public void DeCompress(string fileName, string dirPath)
{
using (Stream source = File.OpenRead(fileName))
{
using (Stream destination = new MemoryStream())
{
using (GZipStream input = new GZipStream(source, CompressionMode.Decompress, true))
{
byte[] bytes = new byte[4096];
int n;
while ((n = input.Read(bytes, 0, bytes.Length)) != 0)
{
destination.Write(bytes, 0, n);
}
}
destination.Flush();
destination.Position = 0;
DeSerializeFiles(destination, dirPath);
}
}
}
67.创建目录副本整合操作
/*
using System.IO;
using System.Collections;
*/
FolderDialog aa = new FolderDialog();
aa.DisplayDialog();
bool b = MessageBox.Show(“是否也创建空文件?”, “构建文件夹框架”, MessageBoxButtons.OKCancel, MessageBoxIcon.Information) == DialogResult.OK ? true : false;
if (aa.Path != “”)
{
string path = (aa.Path.LastIndexOf(“\\”) == aa.Path.Length – 1) ? aa.Path : aa.Path + “\\”;
string parent = Path.GetDirectoryName(%%1);
Directory.CreateDirectory(path + Path.GetFileName(%%1));
%%1 = (%%1.LastIndexOf(“\\”) == %%1.Length – 1) ? %%1 : %%1 + “\\”;
DirectoryInfo dir = new DirectoryInfo(%%1);
FileSystemInfo[] fileArr = dir.GetFileSystemInfos();
Queue<FileSystemInfo> Folders = new Queue<FileSystemInfo>(dir.GetFileSystemInfos());
while (Folders.Count > 0)
{
FileSystemInfo tmp = Folders.Dequeue();
FileInfo f = tmp as FileInfo;
if (f == null)
{
DirectoryInfo d = tmp as DirectoryInfo;
Directory.CreateDirectory(d.FullName.Replace((parent.LastIndexOf(“\\”) == parent.Length – 1) ? parent : parent + “\\”, path));
foreach (FileSystemInfo fi in d.GetFileSystemInfos())
{
Folders.Enqueue(fi);
}
}
else
{
if(b) File.Create(f.FullName.Replace(parent, path));
}
}
}
68.打开网页
System.Diagnostics.Process.Start(“IEXPLORE.EXE”, “http://ant.sourceforge.net/”);
69.删除空文件夹整合操作
//using System.IO;
FolderDialog aa = new FolderDialog();
aa.DisplayDialog();
if (aa.Path != “”)
{
string path = aa.Path;
DirectoryInfo dir = new DirectoryInfo(aa.Path);
FileSystemInfo[] fileArr = dir.GetFileSystemInfos();
Queue<String> Folders = new Queue<String>(Directory.GetDirectories(aa.Path));
while (Folders.Count > 0)
{
path = Folders.Dequeue();
string[] dirs = Directory.GetDirectories(path);
try
{
Directory.Delete(path);
}
catch (Exception)
{
foreach (string direct in dirs)
{
Folders.Enqueue(direct);
}
}
}
}
70.获取磁盘所有分区后再把光驱盘符去除(用”\0″代替),把结果放在数组allfenqu[] 中,数组中每个元素代表一个分区盘符,不包括 :\\ 这样的路径,allfenqu[]数组开始时存放的是所有盘符。
当我用这样的代码测试结果是正确的,光驱盘符会被去掉:
//using System.IO;
stringroot; //root代表盘符路径
for(i=0;i<20;i++) //0-20代表最大的盘符数
{
root.Format(“%c:\\”,allfenqu[i]);
if(GetDriveType(root)==5)
allfenqu[i]=’\0′;
}
但我用这样的代码时结果却无法去掉光驱盘符,allfenqu[]中还是会包含光驱盘符:
stringroot;
for(i=0;i<20;i++)
{
root=allfenqu[i]+”:\\”;
if(GetDriveType(root)==5)
allfenqu[i]=’\0′;
}
71.激活一个程序或程序关联的文件
//using System.Diagnostics;
Process LandFileDivisison;
LandFileDivisison = new System.Diagnostics.Process();
LandFileDivisison.StartInfo.FileName = %%1;
LandFileDivisison.Start();
72.HTTP下载
/*
using System.Web;
using System.Threading;
using System.IO;
using System.Net;
*/
private WebClient client = new WebClient();
Thread th = new Thread(new ThreadStart(StartDownload));
th.Start();
private void StartDownload()
{
//Start.Enabled = false;
string URL = %%1;
int n = URL.LastIndexOf(“/”);
string URLAddress = URL.Substring(0, n);
string fileName = URL.Substring(n + 1, URL.Length – n – 1);
string Dir = %%2;
string Path = Dir.ToString() + “\\” + fileName;
try
{
WebRequest myre = WebRequest.Create(URLAddress);
}
catch (WebException exp)
{
MessageBox.Show(exp.Message, “Error”);
}
try
{
//statusBar.Text = “开始下载文件…”;
client.DownloadFile(URLAddress, fileName);
Stream str = client.OpenRead(URLAddress);
StreamReader reader = new StreamReader(str);
byte[] mbyte = new byte[100000];
int allmybyte = (int)mbyte.Length;
int startmbyte = 0;
//statusBar.Text = “正在接收数据…”;
while (allmybyte > 0)
{
int m = str.Read(mbyte, startmbyte, allmybyte);
if (m == 0)
break;
startmbyte += m;
allmybyte -= m;
}
FileStream fstr = new FileStream(Path, FileMode.OpenOrCreate, FileAccess.Write);
fstr.Write(mbyte, 0, startmbyte);
str.Close();
fstr.Close();
//statusBar.Text = “下载完毕!”;
MessageBox.Show(“下载完毕”);
}
catch (WebException exp)
{
MessageBox.Show(exp.Message, “Error”);
//statusBar.Text = “”;
}
Start.Enabled = true;
}
73.FTP下载
/*
using System.IO;
using System.Text.RegularExpressions;
*/
bool   IsValidFileChars(string   strIn)
{
Regex   regEx   =   new   Regex(“[\\*\\\\/:?<>|\"]“);
return   !regEx.IsMatch(“aj\\pg”);
}
public bool DownloadFile(string RemoteFileName, string LocalPath)
{
return DownloadFile(RemoteFileName, LocalPath, RemoteFileName);
}
/**//// <summary>
/// 从FTP服务器下载文件,指定本地路径和本地文件名
/// </summary>
/// <param name=”RemoteFileName”>远程文件名</param>
/// <param name=”LocalPath”>本地路径</param>
/// <param name=”LocalFilePath”>保存文件的本地路径,后面带有”\”</param>
/// <param name=”LocalFileName”>保存本地的文件名</param>
public bool DownloadFile(string RemoteFileName, string LocalPath, string LocalFileName)
{
byte[] bt = null;
try
{
if (!IsValidFileChars(RemoteFileName) || !IsValidFileChars(LocalFileName) || !IsValidPathChars(LocalPath))
{
throw new Exception(“非法文件名或目录名!”);
}
if (!Directory.Exists(LocalPath))
{
throw new Exception(“本地文件路径不存在!”);
}
string LocalFullPath = Path.Combine(LocalPath, LocalFileName);
if (File.Exists(LocalFullPath))
{
throw new Exception(“当前路径下已经存在同名文件!”);
}
bt = DownloadFile(RemoteFileName);
if (bt != null)
{
FileStream stream = new FileStream(LocalFullPath, FileMode.Create);
stream.Write(bt, 0, bt.Length);
stream.Flush();
stream.Close();
return true;
}
else
{
return false;
}
}
catch (Exception ep)
{
ErrorMsg = ep.ToString();
throw ep;
}
}
/**//// <summary>
/// 从FTP服务器下载文件,返回文件二进制数据
/// </summary>
/// <param name=”RemoteFileName”>远程文件名</param>
public byte[] DownloadFile(string RemoteFileName)
{
try
{
if (!IsValidFileChars(RemoteFileName))
{
throw new Exception(“非法文件名或目录名!”);
}
Response = Open(new Uri(this.Uri.ToString() + RemoteFileName), WebRequestMethods.Ftp.DownloadFile);
Stream Reader = Response.GetResponseStream();
MemoryStream mem = new MemoryStream(1024 * 500);
byte[] buffer = new byte[1024];
int bytesRead = 0;
int TotalByteRead = 0;
while (true)
{
bytesRead = Reader.Read(buffer, 0, buffer.Length);
TotalByteRead += bytesRead;
if (bytesRead == 0)
break;
mem.Write(buffer, 0, bytesRead);
}
if (mem.Length > 0)
{
return mem.ToArray();
}
else
{
return null;
}
}
catch (Exception ep)
{
ErrorMsg = ep.ToString();
throw ep;
}
}
74.写图像到剪切板 setClipboardImage
//using System.IO;
Bitmap   bm   =new   Bitmap(filename);
Clipboard.SetDataObject(bm,true);
75.从剪贴板复制图像到窗体
if (Clipboard.ContainsImage())
{
this.pictureBox1.Image =  Clipboard.GetImage();
}
剪贴板中的数据类型
//using System.IO;
d.GetDataPresent(DataFormats.Bitmap)//(.Text       .Html)
Bitmap   b   =   (Bitmap)d.GetData(DataFormat   Bitmap)
粘贴
IDataObject   data   =   Clipboard.GetDataObjects;
if(Data.GetDataPresent(DataFormats.Bipmap))
{
b.Save(@”C:\mymap.bmp”);
}
76.删除文件夹下的所有文件且不删除文件夹下的文件夹
//using System.IO;
77.XML遍历结点属性值
//using System.IO;
78.拷贝文件名复制文件
//添加引用System.Windows.Forms
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Windows.Forms;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
IDataObject iData = Clipboard.GetDataObject();
string str;
// 将数据与指定的格式进行匹配,返回bool
if (iData.GetDataPresent(DataFormats.Text))
{
// GetData检索数据并指定一个格式
str = (string)iData.GetData(DataFormats.Text);
File.Copy(str, @”C:\” + Path.GetFileName(str));
}
else
{
MessageBox.Show(“目前剪贴板中数据不可转换为文本”, “错误”);
}
}
}
}
79.开源程序库Xercesc-C++代码工程中内联
using System;
using System.IO;
using System.Collections;
using System.Collections.Generic;
using System.Text.RegularExpressions;
using System.Text;
public class InlineXercesc
{
private const String filter = “.cpp”;
private ArrayList all = new ArrayList();
private Queue<String> fal2 = new Queue<String>();
private static String CurDir = Environment.CurrentDirectory;
public InlineXercesc(String lib)
{
string SourceLib = “D:\\Desktop\\大项目\\xerces-c-3.0.1\\src”;
string pattern = “include.*?” + lib + “.*?>”; // 第一个参数为需要匹配的字符串
Match matcher = null;
Queue<string> fal = new Queue<string>();
DirectoryInfo delfile = new DirectoryInfo(CurDir);
foreach (DirectoryInfo files2 in delfile.GetDirectories())
{
String enumDir = CurDir + “\\” + files2.Name + “\\”;
FileSystemInfo[] fileArr = files2.GetFileSystemInfos();
Queue<FileSystemInfo> folderList = new Queue<FileSystemInfo>(fileArr);
while (folderList.Count > 0)
{
FileSystemInfo tmp = folderList.Dequeue();
FileInfo f = tmp as FileInfo;
if (f == null)
{
DirectoryInfo d = tmp as DirectoryInfo;
foreach (FileSystemInfo fi in d.GetFileSystemInfos())
{
folderList.Enqueue(fi);
}
}
else
{
StreamReader br = null;
try
{
br = new StreamReader(file);
// 打开文件
}
catch (IOException e)
{
// 没有打开文件,则产生异常
System.Console.Error.WriteLine(“Cannot read ‘” + f.FullName + “‘: ” + e.Message);
continue;
}
String line;
StringBuilder sb = new StringBuilder(2048);
while ((line = br.ReadLine()) != null)
{
// 读入一行,直到文件结束
matcher = Regex.Match(line, pattern); // 匹配字符串
if (matcher.Success == true)
{
// 如果有匹配的字符串,则输出
sb.Append(line.Replace(line.Substring(line.IndexOf(“<”), (line.LastIndexOf(“/”) + 1) – (line.IndexOf(“<”))), “\”").Replace(‘>’, ‘\”‘));
line = line.Substring(line.IndexOf(“<”) + 1, (line.LastIndexOf(“>”)) – (line.IndexOf(“<”) + 1)).Replace(‘/’, ‘\\’);
fal.Enqueue(SourceLib + “\\” + line);
}
else
{
sb.Append(line);
}
sb.Append(“\r\n”);
}
br.Close(); // 关闭文件
StreamWriter w = new StreamWriter(f.FullName);
w.WriteLine(sb.ToString());
w.Close();
}
}
while (fal.Count > 0)
{
String file = fal.Dequeue(); // 第2个参数开始,均为文件名。
String targetPath = enumDir + file.Substring(file.LastIndexOf(“\\”) + 1);
if (targetPath.IndexOf(‘<’) == -1 && !!File.Exists(targetPath))
{
File.CreateText(targetPath);
StreamReader br = null;
String line;
try
{
br = new StreamReader(new StreamReader(file).BaseStream, System.Text.Encoding.UTF7);
// 打开文件
}
catch (IOException e)
{
// 没有打开文件,则产生异常
//UPGRADE_TODO: 在 .NET 中,method ‘java.lang.Throwable.getMessage’ 的等效项可能返回不同的值。. ‘ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword=”jlca1043″‘
System.Console.Error.WriteLine(“Cannot read ‘” + file + “‘: ” + e.Message);
continue;
}
StreamWriter fw = new StreamWriter(targetPath);
while ((line = br.ReadLine()) != null)
{
// 读入一行,直到文件结束
matcher = Regex.Match(line, pattern); // 匹配字符串
if (matcher.Success == true)
{
// 如果有匹配的字符串,则输出
fal.Enqueue(SourceLib + “\\” + line.Substring(line.IndexOf(“<”) + 1, (line.LastIndexOf(“>”)) – (line.IndexOf(“<”) + 1)).Replace(‘/’, ‘\\’));
line = line.Replace(line.Substring(line.IndexOf(“<”), (line.LastIndexOf(“/”) + 1) – (line.IndexOf(“<”))), “\”");
line = line.Replace(“>”, “\”");
}
fw.Write(line + “\r\n”);
}
fw.Flush();
fw.Close();
br.Close(); // 关闭文件
}
}
Queue<string> folderListArr = new Queue<string>();
folderListArr.Enqueue(CurDir);
while (folderListArr.Count > 0)
{
DirectoryInfo file = new DirectoryInfo(folderListArr.Dequeue());
FileSystemInfo[] files = file.GetFileSystemInfos();
for (int i = 0; i < files.Length; i++)
{
DirectoryInfo ddd = files[i] as DirectoryInfo;
if (ddd != null)
{
folderListArr.Enqueue(files[i].FullName);
}
else
{
if (files[i].Extension == “.hpp”)
{
all.Add(files[i].FullName.Replace(“.hpp”, “.cpp”));
}
}
}
}
int count = 1;
while (count > 0)
{
doSearch(SourceLib);
all.Clear();
while (fal2.Count > 0)
{
String file1 = fal2.Dequeue(); // 第2个参数开始,均为文件名。
String targetPath = enumDir + file1.Substring(file1.LastIndexOf(“\\”) + 1);
if (targetPath.IndexOf(‘<’) == -1 && !File.Exists(targetPath))
{
File.CreateText(targetPath);
StreamReader br = null;
String line;
try
{
br = new StreamReader(file1);
// 打开文件
}
catch (IOException e)
{
System.Console.Error.WriteLine(“Cannot read ‘” + file1 + “‘: ” + e.Message);
continue;
}
StreamWriter fw;
try
{
fw = new StreamWriter(targetPath);
while ((line = br.ReadLine()) != null)
{
// 读入一行,直到文件结束
matcher = Regex.Match(line, pattern); // 匹配字符串
if (matcher.Success == true)
{
// 如果有匹配的字符串,则输出
fal2.Enqueue(SourceLib + “\\” + line.Substring(line.IndexOf(‘<’) + 1, (line.LastIndexOf(‘>’)) – (line.IndexOf(‘<’) + 1)).Replace(‘/’, ‘\\’));
all.Add(fal2.Peek().Replace(“.hpp”, “.cpp”));
line = line.Replace(line.Substring(line.IndexOf(‘<’), (line.LastIndexOf(‘/’) + 1) – (line.IndexOf(‘<’))), “\”");
line = line.Replace(‘>’, ‘\”‘);
}
fw.Write(line + “\r\n”);
}
fw.Flush();
fw.Close();
br.Close(); // 关闭文件
}
catch (IOException e)
{
Console.Error.WriteLine(e.StackTrace);
}
}
}
count = all.Count;
}
}
}
private void doSearch(string path)
{
DirectoryInfo filepath = new DirectoryInfo(path);
if (filepath.Exists)
{
FileSystemInfo[] fileArray = filepath.GetFileSystemInfos();
foreach (FileSystemInfo f in fileArray)
{
DirectoryInfo dd = f as DirectoryInfo;
if (dd != null)
{
doSearch(f.FullName);
}
else
{
FileInfo ff = f as FileInfo;
if (f.Name.IndexOf(filter) > -1)
{
foreach (string file in all)
{
if (file.IndexOf(‘<’) == -1 && Path.GetFileName(file) == f.Name)
{
fal2.Enqueue(f.FullName);
}
}
}
}
}
}
}
static void Main(String[] args)
{
new InlineXercesc(“xercesc”);
FileInfo f = new FileInfo(CurDir + “\\DetailCpp.cmd”);
StreamWriter w = f.CreateText();
w.WriteLine(“copy StdAfx.cpp+*.c+*.cpp ” + CurDir
+ “\\StdAfx.cpp&& del *.c && del *.cpp”);
w.Close();
}
}
80.提取包含头文件列表
//InlineExt.cs
using System;
using System.IO;
using System.Collections;
using System.Collections.Generic;
using System.Text.RegularExpressions;
using System.Text;
public class InlineExt
{
private System.String CurDir = Environment.CurrentDirectory;
public InlineExt()
{
string pattern = “include.*?\”.*?.hpp\”"; // 第一个参数为需要匹配的字符串
Match matcher = null;
FileInfo delfile = new System.IO.FileInfo(CurDir);
FileInfo[] files2 = SupportClass.FileSupport.GetFiles(delfile);
for (int l = 0; l < files2.Length; l++)
{
if (Directory.Exists(files2[l].FullName))
{
Queue<String> ts = new Queue<String>();
FileInfo file = new FileInfo(Path.Combine(files2[l].FullName , “StdAfx.cpp”));
StreamReader br = null;
StreamWriter fw = null;
String line;
try
{
br = new StreamReader(new StreamReader(file.FullName, System.Text.Encoding.Default).BaseStream, new System.IO.StreamReader(file.FullName, System.Text.Encoding.Default).CurrentEncoding); // 打开文件
while ((line = br.ReadLine()) != null)
{
matcher = Regex.Match(line, pattern); // 匹配字符串
if (matcher.Success == true)
{
// 如果有匹配的字符串,则输出
ts.Enqueue(line.Substring(line.IndexOf(‘\”‘) + 1, (line.LastIndexOf(‘\”‘)) – (line.IndexOf(‘\”‘) + 1)));
}
}
FileInfo file2 = new FileInfo(Path.Combine(files2[l].FullName , “ReadMe.txt”));
if (File.Exists(file2.FullName))
{
fw = new StreamWriter(file2.FullName, false, System.Text.Encoding.GetEncoding(“GB2312″)); //System.Text.Encoding.Default
foreach(string it in ts)
{
fw.Write(“#include \”" + it + “\”\r\n”);
}
}
}
catch (IOException e)
{
// 没有打开文件,则产生异常
Console.Error.WriteLine(“Cannot read ‘” + file + “‘: ” + e.Message);
continue;
}
finally
{
try
{
if (br != null)
br.Close();
if (fw != null)
fw.Close();
}
catch (IOException e)
{
Console.WriteLine(e.StackTrace);
}
}
}
}
}
public static void  Main(System.String[] args)
{
new InlineExt();
}
}
//SupportClass.cs
using System;
/// <summary>
/// Contains conversion support elements such as classes, interfaces and static methods.
/// </summary>
public class SupportClass
{
/// <summary>
/// Writes the exception stack trace to the received stream
/// </summary>
/// <param name=”throwable”>Exception to obtain information from</param>
/// <param name=”stream”>Output sream used to write to</param>
public static void WriteStackTrace(System.Exception throwable, System.IO.TextWriter stream)
{
stream.Write(throwable.StackTrace);
stream.Flush();
}
/*******************************/
/// <summary>
/// Represents the methods to support some operations over files.
/// </summary>
public class FileSupport
{
/// <summary>
/// Creates a new empty file with the specified pathname.
/// </summary>
/// <param name=”path”>The abstract pathname of the file</param>
/// <returns>True if the file does not exist and was succesfully created</returns>
public static bool CreateNewFile(System.IO.FileInfo path)
{
if (path.Exists)
{
return false;
}
else
{
System.IO.FileStream createdFile = path.Create();
createdFile.Close();
return true;
}
}
/// <summary>
/// Compares the specified object with the specified path
/// </summary>
/// <param name=”path”>An abstract pathname to compare with</param>
/// <param name=”file”>An object to compare with the given pathname</param>
/// <returns>A value indicating a lexicographically comparison of the parameters</returns>
public static int CompareTo(System.IO.FileInfo path, System.Object file)
{
if( file is System.IO.FileInfo )
{
System.IO.FileInfo fileInfo = (System.IO.FileInfo)file;
return path.FullName.CompareTo( fileInfo.FullName );
}
else
{
throw new System.InvalidCastException();
}
}
/// <summary>
/// Returns an array of abstract pathnames representing the files and directories of the specified path.
/// </summary>
/// <param name=”path”>The abstract pathname to list it childs.</param>
/// <returns>An array of abstract pathnames childs of the path specified or null if the path is not a directory</returns>
public static System.IO.FileInfo[] GetFiles(System.IO.FileInfo path)
{
if ( (path.Attributes & System.IO.FileAttributes.Directory) > 0 )
{
String[] fullpathnames = System.IO.Directory.GetFileSystemEntries(path.FullName);
System.IO.FileInfo[] result = new System.IO.FileInfo[fullpathnames.Length];
for(int i = 0; i < result.Length ; i++)
result[i] = new System.IO.FileInfo(fullpathnames[i]);
return result;
}
else return null;
}
/// <summary>
/// Creates an instance of System.Uri class with the pech specified
/// </summary>
/// <param name=”path”>The abstract path name to create the Uri</param>
/// <returns>A System.Uri instance constructed with the specified path</returns>
public static System.Uri ToUri(System.IO.FileInfo path)
{
System.UriBuilder uri = new System.UriBuilder();
uri.Path = path.FullName;
uri.Host = String.Empty;
uri.Scheme = System.Uri.UriSchemeFile;
return uri.Uri;
}
/// <summary>
/// Returns true if the file specified by the pathname is a hidden file.
/// </summary>
/// <param name=”file”>The abstract pathname of the file to test</param>
/// <returns>True if the file is hidden, false otherwise</returns>
public static bool IsHidden(System.IO.FileInfo file)
{
return ((file.Attributes & System.IO.FileAttributes.Hidden) > 0);
}
/// <summary>
/// Sets the read-only property of the file to true.
/// </summary>
/// <param name=”file”>The abstract path name of the file to modify</param>
public static bool SetReadOnly(System.IO.FileInfo file)
{
try
{
file.Attributes = file.Attributes | System.IO.FileAttributes.ReadOnly;
return true;
}
catch (System.Exception exception)
{
String exceptionMessage = exception.Message;
return false;
}
}
/// <summary>
/// Sets the last modified time of the specified file with the specified value.
/// </summary>
/// <param name=”file”>The file to change it last-modified time</param>
/// <param name=”date”>Total number of miliseconds since January 1, 1970 (new last-modified time)</param>
/// <returns>True if the operation succeeded, false otherwise</returns>
public static bool SetLastModified(System.IO.FileInfo file, long date)
{
try
{
long valueConstant = (new System.DateTime(1969, 12, 31, 18, 0, 0)).Ticks;
file.LastWriteTime = new System.DateTime( (date * 10000L) + valueConstant );
return true;
}
catch (System.Exception exception)
{
String exceptionMessage = exception.Message;
return false;
}
}
}
}
81.剪贴扳转换成打印字符
//using System.Windows.Forms;
IDataObject iData = Clipboard.GetDataObject();
string str;
// 将数据与指定的格式进行匹配,返回bool
if (iData.GetDataPresent(DataFormats.Text))
{
// GetData检索数据并指定一个格式
str = (string)iData.GetData(DataFormats.Text);
string[] arr = str.Split(“\r\n”.ToCharArray());
StringBuilder sb = new StringBuilder(1024);
sb.Append(“System.out.println(\”@echooff\”);\r\n”);
foreach (string s in arr)
{
if (s.Trim()!=”")
{
sb.Append(“System.out.println(\”ECHO ” + s.Replace(“^”, “^^”).Replace(“&”, “^&”).Replace(“:”, “^:”).Replace(“>”, “^>”).Replace(“<”, “^<”).Replace(“|”, “^|”).Replace(“\”", “^\”").Replace(@”\”, @”\\”).Replace(“\”", “\\\”") + “\”);”);
sb.Append(“\r\n”);
}
}
Clipboard.SetText(sb.ToString());
}
else
{
MessageBox.Show(“目前剪贴板中数据不可转换为文本”, “错误”);
}
82.把JButton或JTree组件写到一个流中
83.注册全局热键
注册全局热键要用到Windows的API方法RegisterHotKey和UnregisterHotKey。
一、声明注册热键方法 [DllImport("user32.dll")]
private static extern int RegisterHotKey(IntPtr hwnd, int id, int fsModifiers, int vk);
[DllImport("user32.dll")]
private static extern int UnregisterHotKey(IntPtr hwnd, int id);
int Space = 32; //热键ID
private const int WM_HOTKEY = 0×312; //窗口消息-热键
private const int WM_CREATE = 0×1; //窗口消息-创建
private const int WM_DESTROY = 0×2; //窗口消息-销毁
private const int MOD_ALT = 0×1; //ALT
private const int MOD_CONTROL = 0×2; //CTRL
private const int MOD_SHIFT = 0×4; //SHIFT
private const int VK_SPACE = 0×20; //SPACE
二、注册热键方法 /// <summary>
/// 注册热键
/// </summary>
/// <param name=”hwnd”>窗口句柄</param>
/// <param name=”hotKey_id”>热键ID</param>
/// <param name=”fsModifiers”>组合键</param>
/// <param name=”vk”>热键</param>
private void RegKey(IntPtr hwnd, int hotKey_id, int fsModifiers, int vk)
{
bool result;
if (RegisterHotKey(hwnd,hotKey_id,fsModifiers,vk) == 0)
{
result = false;
}
else
{
result = true;
}
if (!result)
{
MessageBox.Show(“注册热键失败!”);
}
}
/// <summary>
/// 注销热键
/// </summary>
/// <param name=”hwnd”>窗口句柄</param>
/// <param name=”hotKey_id”>热键ID</param>
private void UnRegKey(IntPtr hwnd, int hotKey_id)
{
UnregisterHotKey(hwnd,hotKey_id);
}
三、重写WndProc方法,实现注册 protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
switch(m.Msg)
{
case WM_HOTKEY: //窗口消息-热键
switch(m.WParam.ToInt32())
{
case 32: //热键ID
MessageBox.Show(“Hot Key : Ctrl + Alt + Shift + Space”);
break;
default:
break;
}
break;
case WM_CREATE: //窗口消息-创建
RegKey(Handle,Space,MOD_ALT | MOD_CONTROL | MOD_SHIFT,VK_SPACE); //注册热键
break;
case WM_DESTROY: //窗口消息-销毁
UnRegKey(Handle,Space); //销毁热键
break;
default:
break;
}
}
附:虚拟键值表
{ Virtual Keys, Standard Set }
{$EXTERNALSYM VK_LBUTTON}
VK_LBUTTON = 1;
{$EXTERNALSYM VK_RBUTTON}
VK_RBUTTON = 2;
{$EXTERNALSYM VK_CANCEL}
VK_CANCEL = 3;
{$EXTERNALSYM VK_MBUTTON}
VK_MBUTTON = 4; { NOT contiguous with L & RBUTTON }
{$EXTERNALSYM VK_BACK}
VK_BACK = 8;
{$EXTERNALSYM VK_TAB}
VK_TAB = 9;
{$EXTERNALSYM VK_CLEAR}
VK_CLEAR = 12;
{$EXTERNALSYM VK_RETURN}
VK_RETURN = 13;
{$EXTERNALSYM VK_SHIFT}
VK_SHIFT = $10;
{$EXTERNALSYM VK_CONTROL}
VK_CONTROL = 17;
{$EXTERNALSYM VK_MENU}
VK_MENU = 18;
{$EXTERNALSYM VK_PAUSE}
VK_PAUSE = 19;
{$EXTERNALSYM VK_CAPITAL}
VK_CAPITAL = 20;
{$EXTERNALSYM VK_KANA }
VK_KANA = 21;
{$EXTERNALSYM VK_HANGUL }
VK_HANGUL = 21;
{$EXTERNALSYM VK_JUNJA }
VK_JUNJA = 23;
{$EXTERNALSYM VK_FINAL }
VK_FINAL = 24;
{$EXTERNALSYM VK_HANJA }
VK_HANJA = 25;
{$EXTERNALSYM VK_KANJI }
VK_KANJI = 25;
{$EXTERNALSYM VK_CONVERT }
VK_CONVERT = 28;
{$EXTERNALSYM VK_NONCONVERT }
VK_NONCONVERT = 29;
{$EXTERNALSYM VK_ACCEPT }
VK_ACCEPT = 30;
{$EXTERNALSYM VK_MODECHANGE }
VK_MODECHANGE = 31;
{$EXTERNALSYM VK_ESCAPE}
VK_ESCAPE = 27;
{$EXTERNALSYM VK_SPACE}
VK_SPACE = $20;
{$EXTERNALSYM VK_PRIOR}
VK_PRIOR = 33;
{$EXTERNALSYM VK_NEXT}
VK_NEXT = 34;
{$EXTERNALSYM VK_END}
VK_END = 35;
{$EXTERNALSYM VK_HOME}
VK_HOME = 36;
{$EXTERNALSYM VK_LEFT}
VK_LEFT = 37;
{$EXTERNALSYM VK_UP}
VK_UP = 38;
{$EXTERNALSYM VK_RIGHT}
VK_RIGHT = 39;
{$EXTERNALSYM VK_DOWN}
VK_DOWN = 40;
{$EXTERNALSYM VK_SELECT}
VK_SELECT = 41;
{$EXTERNALSYM VK_PRINT}
VK_PRINT = 42;
{$EXTERNALSYM VK_EXECUTE}
VK_EXECUTE = 43;
{$EXTERNALSYM VK_SNAPSHOT}
VK_SNAPSHOT = 44;
{$EXTERNALSYM VK_INSERT}
VK_INSERT = 45;
{$EXTERNALSYM VK_DELETE}
VK_DELETE = 46;
{$EXTERNALSYM VK_HELP}
VK_HELP = 47;
{ VK_0 thru VK_9 are the same as ASCII ’0′ thru ’9′ ($30 – $39) }
{ VK_A thru VK_Z are the same as ASCII ‘A’ thru ‘Z’ ($41 – $5A) }
{$EXTERNALSYM VK_LWIN}
VK_LWIN = 91;
{$EXTERNALSYM VK_RWIN}
VK_RWIN = 92;
{$EXTERNALSYM VK_APPS}
VK_APPS = 93;
{$EXTERNALSYM VK_NUMPAD0}
VK_NUMPAD0 = 96;
{$EXTERNALSYM VK_NUMPAD1}
VK_NUMPAD1 = 97;
{$EXTERNALSYM VK_NUMPAD2}
VK_NUMPAD2 = 98;
{$EXTERNALSYM VK_NUMPAD3}
VK_NUMPAD3 = 99;
{$EXTERNALSYM VK_NUMPAD4}
VK_NUMPAD4 = 100;
{$EXTERNALSYM VK_NUMPAD5}
VK_NUMPAD5 = 101;
{$EXTERNALSYM VK_NUMPAD6}
VK_NUMPAD6 = 102;
{$EXTERNALSYM VK_NUMPAD7}
VK_NUMPAD7 = 103;
{$EXTERNALSYM VK_NUMPAD8}
VK_NUMPAD8 = 104;
{$EXTERNALSYM VK_NUMPAD9}
VK_NUMPAD9 = 105;
{$EXTERNALSYM VK_MULTIPLY}
VK_MULTIPLY = 106;
{$EXTERNALSYM VK_ADD}
VK_ADD = 107;
{$EXTERNALSYM VK_SEPARATOR}
VK_SEPARATOR = 108;
{$EXTERNALSYM VK_SUBTRACT}
VK_SUBTRACT = 109;
{$EXTERNALSYM VK_DECIMAL}
VK_DECIMAL = 110;
{$EXTERNALSYM VK_DIVIDE}
VK_DIVIDE = 111;
{$EXTERNALSYM VK_F1}
VK_F1 = 112;
{$EXTERNALSYM VK_F2}
VK_F2 = 113;
{$EXTERNALSYM VK_F3}
VK_F3 = 114;
{$EXTERNALSYM VK_F4}
VK_F4 = 115;
{$EXTERNALSYM VK_F5}
VK_F5 = 116;
{$EXTERNALSYM VK_F6}
VK_F6 = 117;
{$EXTERNALSYM VK_F7}
VK_F7 = 118;
{$EXTERNALSYM VK_F8}
VK_F8 = 119;
{$EXTERNALSYM VK_F9}
VK_F9 = 120;
{$EXTERNALSYM VK_F10}
VK_F10 = 121;
{$EXTERNALSYM VK_F11}
VK_F11 = 122;
{$EXTERNALSYM VK_F12}
VK_F12 = 123;
{$EXTERNALSYM VK_F13}
VK_F13 = 124;
{$EXTERNALSYM VK_F14}
VK_F14 = 125;
{$EXTERNALSYM VK_F15}
VK_F15 = 126;
{$EXTERNALSYM VK_F16}
VK_F16 = 127;
{$EXTERNALSYM VK_F17}
VK_F17 = 128;
{$EXTERNALSYM VK_F18}
VK_F18 = 129;
{$EXTERNALSYM VK_F19}
VK_F19 = 130;
{$EXTERNALSYM VK_F20}
VK_F20 = 131;
{$EXTERNALSYM VK_F21}
VK_F21 = 132;
{$EXTERNALSYM VK_F22}
VK_F22 = 133;
{$EXTERNALSYM VK_F23}
VK_F23 = 134;
{$EXTERNALSYM VK_F24}
VK_F24 = 135;
{$EXTERNALSYM VK_NUMLOCK}
VK_NUMLOCK = 144;
{$EXTERNALSYM VK_SCROLL}
VK_SCROLL = 145;
{ VK_L & VK_R – left and right Alt, Ctrl and Shift virtual keys.
Used only as parameters to GetAsyncKeyState() and GetKeyState().
No other API or message will distinguish left and right keys in this way. }
{$EXTERNALSYM VK_LSHIFT}
VK_LSHIFT = 160;
84.菜单勾选/取消完成后关闭计算机
/*
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential, Pack = 1)]
internal struct TokPriv1Luid
{
public int Count;
public long Luid;
public int Attr;
}
[DllImport("kernel32.dll", ExactSpelling = true)]
internal static extern IntPtr GetCurrentProcess();

[DllImport("advapi32.dll", ExactSpelling = true, SetLastError = true)]
internal static extern bool OpenProcessToken(IntPtr h, int acc, ref   IntPtr phtok);

[DllImport("advapi32.dll", SetLastError = true)]
internal static extern bool LookupPrivilegeValue(string host, string name, ref   long pluid);

[DllImport("advapi32.dll", ExactSpelling = true, SetLastError = true)]
internal static extern bool AdjustTokenPrivileges(IntPtr htok, bool disall, ref TokPriv1Luid newst, int len, IntPtr prev, IntPtr relen);

[DllImport("user32.dll", ExactSpelling = true, SetLastError = true)]
internal static extern bool ExitWindowsEx(int flg, int rea);

internal const int SE_PRIVILEGE_ENABLED = 0×00000002;
internal const int TOKEN_QUERY = 0×00000008;
internal const int TOKEN_ADJUST_PRIVILEGES = 0×00000020;
internal const string SE_SHUTDOWN_NAME = “SeShutdownPrivilege”;
internal const int EWX_SHUTDOWN = 0×00000001;
internal const int EWX_POWEROFF = 0×00000008;
internal const int EWX_FORCE = 0×00000004;
internal const int EWX_FORCEIFHUNG = 0×00000010;
*/
int flg=EWX_FORCE | EWX_POWEROFF;
bool ok;
TokPriv1Luid tp;
IntPtr hproc = GetCurrentProcess();
IntPtr htok = IntPtr.Zero;
k = OpenProcessToken(hproc, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, ref   htok);
tp.Count = 1;
tp.Luid = 0;
tp.Attr = SE_PRIVILEGE_ENABLED;
k = LookupPrivilegeValue(null, SE_SHUTDOWN_NAME, ref   tp.Luid);
k = AdjustTokenPrivileges(htok, false, ref   tp, 0, IntPtr.Zero, IntPtr.Zero);
k = ExitWindowsEx(flg, 0);
85.菜单勾选/取消完成后重新启动计算机
/*
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential, Pack = 1)]
internal struct TokPriv1Luid
{
public int Count;
public long Luid;
public int Attr;
}
[DllImport("kernel32.dll", ExactSpelling = true)]
internal static extern IntPtr GetCurrentProcess();

[DllImport("advapi32.dll", ExactSpelling = true, SetLastError = true)]
internal static extern bool OpenProcessToken(IntPtr h, int acc, ref   IntPtr phtok);

[DllImport("advapi32.dll", SetLastError = true)]
internal static extern bool LookupPrivilegeValue(string host, string name, ref   long pluid);

[DllImport("advapi32.dll", ExactSpelling = true, SetLastError = true)]
internal static extern bool AdjustTokenPrivileges(IntPtr htok, bool disall, ref TokPriv1Luid newst, int len, IntPtr prev, IntPtr relen);

[DllImport("user32.dll", ExactSpelling = true, SetLastError = true)]
internal static extern bool ExitWindowsEx(int flg, int rea);

internal const int SE_PRIVILEGE_ENABLED = 0×00000002;
internal const int TOKEN_QUERY = 0×00000008;
internal const int TOKEN_ADJUST_PRIVILEGES = 0×00000020;
internal const string SE_SHUTDOWN_NAME = “SeShutdownPrivilege”;
internal const int EWX_SHUTDOWN = 0×00000001;
internal const int EWX_REBOOT = 0×00000002;
internal const int EWX_FORCE = 0×00000004;
internal const int EWX_FORCEIFHUNG = 0×00000010;
*/
int flg=EWX_FORCE | EWX_REBOOT;
bool ok;
TokPriv1Luid tp;
IntPtr hproc = GetCurrentProcess();
IntPtr htok = IntPtr.Zero;
k = OpenProcessToken(hproc, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, ref   htok);
tp.Count = 1;
tp.Luid = 0;
tp.Attr = SE_PRIVILEGE_ENABLED;
k = LookupPrivilegeValue(null, SE_SHUTDOWN_NAME, ref   tp.Luid);
k = AdjustTokenPrivileges(htok, false, ref   tp, 0, IntPtr.Zero, IntPtr.Zero);
k = ExitWindowsEx(flg, 0);
86.菜单勾选/取消完成后注销计算机
/*
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential, Pack = 1)]
internal struct TokPriv1Luid
{
public int Count;
public long Luid;
public int Attr;
}
[DllImport("kernel32.dll", ExactSpelling = true)]
internal static extern IntPtr GetCurrentProcess();

[DllImport("advapi32.dll", ExactSpelling = true, SetLastError = true)]
internal static extern bool OpenProcessToken(IntPtr h, int acc, ref   IntPtr phtok);

[DllImport("advapi32.dll", SetLastError = true)]
internal static extern bool LookupPrivilegeValue(string host, string name, ref   long pluid);

[DllImport("advapi32.dll", ExactSpelling = true, SetLastError = true)]
internal static extern bool AdjustTokenPrivileges(IntPtr htok, bool disall, ref TokPriv1Luid newst, int len, IntPtr prev, IntPtr relen);

[DllImport("user32.dll", ExactSpelling = true, SetLastError = true)]
internal static extern bool ExitWindowsEx(int flg, int rea);

internal const int SE_PRIVILEGE_ENABLED = 0×00000002;
internal const int TOKEN_QUERY = 0×00000008;
internal const int TOKEN_ADJUST_PRIVILEGES = 0×00000020;
internal const string SE_SHUTDOWN_NAME = “SeShutdownPrivilege”;
internal const int EWX_SHUTDOWN = 0×00000001;
internal const int EWX_LOGOFF = 0×00000000;
internal const int EWX_FORCE = 0×00000004;
internal const int EWX_FORCEIFHUNG = 0×00000010;
*/
int flg=EWX_FORCE | EWX_LOGOFF;
bool ok;
TokPriv1Luid tp;
IntPtr hproc = GetCurrentProcess();
IntPtr htok = IntPtr.Zero;
k = OpenProcessToken(hproc, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, ref   htok);
tp.Count = 1;
tp.Luid = 0;
tp.Attr = SE_PRIVILEGE_ENABLED;
k = LookupPrivilegeValue(null, SE_SHUTDOWN_NAME, ref   tp.Luid);
k = AdjustTokenPrivileges(htok, false, ref   tp, 0, IntPtr.Zero, IntPtr.Zero);
k = ExitWindowsEx(flg, 0);
87.菜单勾选/取消开机自启动程序
public void RunWhenStart(bool Started)
{
string name=%%1;
string path=Application.ExecutablePath;
RegistryKey HKLM = Registry.LocalMachine;
RegistryKey Run = HKLM.CreateSubKey(@”SOFTWARE\Microsoft\Windows\CurrentVersion\Run\”);
if (Started == true)
{
try
{
Run.SetValue(name, path);
HKLM.Close();
}
catch (Exception)
{
MessageBox.Show(“注册表修改错误(开机自启未实现)”);
}
}
else
{
try
{
if (Run.GetValue(name) != null)
{
Run.DeleteValue(name);
HKLM.Close();
}
else
return;
}
catch (Exception e)
{
//ExceptionTransact.WriteErrLog(base.GetType().Name, e.Message);
MessageBox(e.Message);
}
}
}
88.菜单勾选/取消自动登录系统
89.模拟键盘输入字符串
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using KenZhang.Free.VirtualInput;
using System.Runtime.InteropServices;
namespace VirtualInputDemo
{
public partial class Form1 : Form
{
public const int INPUT_KEYBOARD = 1;
public const int KEYEVENTF_KEYUP = 0×0002;
[DllImport("user32.dll")]
public static extern UInt32 SendInput(UInt32 nInputs, ref INPUT pInputs, int cbSize);
[StructLayout(LayoutKind.Explicit)]
public struct INPUT
{
[FieldOffset(0)]
public Int32 type;
[FieldOffset(4)]
public KEYBDINPUT ki;
[FieldOffset(4)]
public MOUSEINPUT mi;
[FieldOffset(4)]
public HARDWAREINPUT hi;
}

[StructLayout(LayoutKind.Sequential)]
public struct MOUSEINPUT
{
public Int32 dx;
public Int32 dy;
public Int32 mouseData;
public Int32 dwFlags;
public Int32 time;
public IntPtr dwExtraInfo;
}
[StructLayout(LayoutKind.Sequential)]
public struct KEYBDINPUT
{
public Int16 wVk;
public Int16 wScan;
public Int32 dwFlags;
public Int32 time;
public IntPtr dwExtraInfo;
}
[StructLayout(LayoutKind.Sequential)]
public struct HARDWAREINPUT
{
public Int32 uMsg;
public Int16 wParamL;
public Int16 wParamH;
}
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
textBox1.Focus();
INPUT inDown = new INPUT();
inDown.type = INPUT_KEYBOARD;
inDown.ki.wVk = (int)Keys.A;
//INPUT inUp = new INPUT();
//inUp.type = INPUT_KEYBOARD;
//inUp.ki.wVk = (int)Keys.A;
//inUp.ki.dwFlags = KEYEVENTF_KEYUP;
SendInput(1, ref  inDown, Marshal.SizeOf(inDown));
//SendInput(1, ref  inUp, Marshal.SizeOf(inUp));
}
}
}
90.提取PDF文件中的文本
xpdf
public partial class Form1 : Form
{
public OpenFileDialog fdlg = new OpenFileDialog();//打开文件对话框
public string filename;
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
ofdlg.Filter = “pdf文件(*.pdf)|*.pdf”;//选择pdf文件
if (ofdlg.ShowDialog() == DialogResult.OK)
{
filename = string.Format(“{0}”, ofdlg.FileName);
}
}
//传送打开文件对话框中得到的filename来做为外部程序的参数来做转化
private void button2_Click(object sender, EventArgs e)
{
Process p = new Process();
string path = “pdftotext.exe”; //进程启用外部程序
//这个exe我放在debug文件夹下面
p.StartInfo.FileName = path;
p.StartInfo.Arguments = string.Format( filename + ” -”);//很怪异的一行
//参数“-”表示可以得到输出流
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.CreateNoWindow = true;

p.Start();
string s = p.StandardOutput.ReadToEnd();//得到pdf文档中的文本内容
textBox1.Text = s;
p.Close();
}
}
}

上面的程序运行后,如果是在Debug文件夹下的pdf文件就可以得到输出,可是如果在打开文件对话框中打开我桌面上的一个pdf如:@”d:\我的文档\test.pdf”,输出就会是空,但是如果把上面那怪异的一行改为:
C# code
p.StartInfo.Arguments = string.Format( @”d:\我的文档\test.pdf” + ” -”);

程序就又会得到输出。
呵呵,谢谢楼上的兄台,下载的xpdf中xpdftotext.exe用到的配置文件xpdfrc需要手动配置,我如果把那些字体啊,什么的映射成绝对路径下的文件,就不会出现上面的问题,但是我把配置文件中的路径改成了相对路径,于是就出现了上面的问题了,看兄台能够很轻易的就运行成功,一定是做过很多代码的,这里还得劳烦兄台再给看一下,帮下忙,能遇到一个大神不容易,大神可不能吝啬啊,先谢过了哈
91.操作内存映射文件
/*
using System.Runtime.InteropServices;
[DllImport("kernel32.dll")]
public static extern IntPtr CreateFileMapping(IntPtr hFile,
IntPtr lpFileMappingAttributes, uint flProtect,
uint dwMaximumSizeHigh,
uint dwMaximumSizeLow, string lpName);
[DllImport("kernel32.dll")]
public static extern IntPtr MapViewOfFile(IntPtr hFileMappingObject, uint
dwDesiredAccess, uint dwFileOffsetHigh, uint dwFileOffsetLow,
IntPtr dwNumberOfBytesToMap);
[DllImport("kernel32.dll")]
public static extern bool UnmapViewOfFile(IntPtr lpBaseAddress);
[DllImport("kernel32.dll")]
public static extern bool CloseHandle(IntPtr hObject);
[DllImport("kernel32.dll")]
public static extern IntPtr CreateFile(string lpFileName,
int dwDesiredAccess, FileShare dwShareMode, IntPtr securityAttrs,
FileMode dwCreationDisposition, int dwFlagsAndAttributes, IntPtr hTemplateFile);
[DllImport("kernel32.dll")]
public static extern uint GetFileSize(IntPtr hFile, IntPtr lpFileSizeHigh);
public const int GENERIC_READ = -2147483648; //0×80000000
public const int GENERIC_WRITE = 0×40000000;
public const int GENERIC_EXECUTE = 0×20000000;
public const int GENERIC_ALL = 0×10000000;
public const int FILE_ATTRIBUTE_NORMAL = 0×80;
public const int FILE_FLAG_SEQUENTIAL_SCAN = 0×8000000;
public const int INVALID_HANDLE_VALUE = -1;
public const int PAGE_NOACCESS = 1;
public const int PAGE_READONLY = 2;
public const int PAGE_READWRITE = 4;
public const int FILE_MAP_COPY = 1;
public const int FILE_MAP_WRITE = 2;
public const int FILE_MAP_READ = 4;
*/
IntPtr vFileHandle = CreateFile(@”c:\temp\temp.txt”,
GENERIC_READ | GENERIC_WRITE, FileShare.Read | FileShare.Write,
IntPtr.Zero,  FileMode.Open,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, IntPtr.Zero);
if (INVALID_HANDLE_VALUE != (int)vFileHandle)
{
IntPtr vMappingHandle = CreateFileMapping(
vFileHandle, IntPtr.Zero, PAGE_READWRITE, 0, 0, “~MappingTemp”);
if (vMappingHandle != IntPtr.Zero)
{
IntPtr vHead = MapViewOfFile(vMappingHandle,
FILE_MAP_COPY | FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, IntPtr.Zero);
if (vHead != IntPtr.Zero)
{
uint vSize = GetFileSize(vFileHandle, IntPtr.Zero);
for (int i = 0; i <= vSize / 2; i++)
{
byte vTemp = Marshal.ReadByte((IntPtr)((int)vHead + i));
Marshal.WriteByte((IntPtr)((int)vHead + i),
Marshal.ReadByte((IntPtr)((int)vHead + vSize – i – 1)));
Marshal.WriteByte((IntPtr)((int)vHead + vSize – i – 1), vTemp);
}
UnmapViewOfFile(vHead);
}
CloseHandle(vMappingHandle);
}
CloseHandle(vFileHandle);
}
92.重定向windows控制台程序的输出信息
delegate void dReadLine(string strLine);
private void excuteCommand(string strFile, string args, dReadLine onReadLine)
{
System.Diagnostics.Process p = new System.Diagnostics.Process();
p.StartInfo = new System.Diagnostics.ProcessStartInfo();
p.StartInfo.FileName = strFile;
p.StartInfo.Arguments = args;
p.StartInfo.WindowStyle. = System.Diagnostics.ProcessWindowStyle.Hidden;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.UseShellExecute = false;
p.StartInfo.CreateNoWindow = true;
p.Start();
System.IO.StreamReader reader = p.StandardOutput;//截取输出流
string line = reader.ReadLine();//每次读取一行
while (!reader.EndOfStream)
{
onReadLine(line);
line = reader.ReadLine();
}
p.WaitForExit();
}
private void PrintMessage(string strLine)
{
this.textBox1.Text += strLine + ” “;
}
excuteCommand(“ipconfig”, “”, new dReadLine(PrintMessage));
93.接受邮件
94.发送邮件
using System;
using System.Net.Sockets;
using System.Net;
using System.Security.Cryptography;
using System.IO;
// 类名:Pop3
// 功能:接收电子邮件
namespace ZTSX.Email
{
/// <summary>
/// Pop3 的摘要说明。
/// </summary>
public class Pop3
{
private string mstrHost     = null; //主机名称或IP地址
private int mintPort     = 110; //主机的端口号(默认为110)
private TcpClient mtcpClient   = null; //客户端
private NetworkStream mnetStream = null; //网络基础数据流
private StreamReader m_stmReader = null; //读取字节流
private string mstrStatMessage   = null; //执行STAT命令后得到的消息(从中得到邮件数)
/// <summary>
/// 构造函数
/// </summary>
/// <remarks>一个邮件接收对象</remarks>
public Pop3()
{
}
/// <summary>
/// 构造函数
/// </summary>
/// <param name=”host”>主机名称或IP地址</param>
public Pop3(string host)
{
mstrHost = host;
}
/// <summary>
/// 构造函数
/// </summary>
/// <param name=”host”>主机名称或IP地址</param>
/// <param name=”port”>主机的端口号</param>
/// <remarks>一个邮件接收对象</remarks>
public Pop3(string host,int port)
{
mstrHost = host;
mintPort = port;
}
#region 属性
/// <summary>
/// 主机名称或IP地址
/// </summary>
/// <remarks>主机名称或IP地址</remarks>
public string HostName
{
get{return mstrHost;}
set{mstrHost = value;}
}
/// <summary>
/// 主机的端口号
/// </summary>
/// <remarks>主机的端口号</remarks>
public int Port
{
get{return mintPort;}
set{mintPort = value;}
}
#endregion
#region 私有方法
/// <summary>
/// 向网络访问的基础数据流中写数据(发送命令码)
/// </summary>
/// <param name=”netStream”>可以用于网络访问的基础数据流</param>
/// <param name=”command”>命令行</param>
/// <remarks>向网络访问的基础数据流中写数据(发送命令码)</remarks>
private void WriteToNetStream(ref NetworkStream netStream,String command)
{
string strToSend = command + “\r\n”;
byte[] arrayToSend = System.Text.Encoding.ASCII.GetBytes(strToSend.ToCharArray());
netStream.Write(arrayToSend,0,arrayToSend.Length);
}
/// <summary>
/// 检查命令行结果是否正确
/// </summary>
/// <param name=”message”>命令行的执行结果</param>
/// <param name=”check”>正确标志</param>
/// <returns>
/// 类型:布尔
/// 内容:true表示没有错误,false为有错误
/// </returns>
/// <remarks>检查命令行结果是否有错误</remarks>
private bool CheckCorrect(string message,string check)
{
if(message.IndexOf(check) == -1)
return false;
else
return true;
}
/// <summary>
/// 邮箱中的未读邮件数
/// </summary>
/// <param name=”message”>执行完LIST命令后的结果</param>
/// <returns>
/// 类型:整型
/// 内容:邮箱中的未读邮件数
/// </returns>
/// <remarks>邮箱中的未读邮件数</remarks>
private int GetMailNumber(string message)
{
string[] strMessage = message.Split(‘ ‘);
return Int32.Parse(strMessage[1]);
}
/// <summary>
/// 得到经过解码后的邮件的内容
/// </summary>
/// <param name=”encodingContent”>解码前的邮件的内容</param>
/// <returns>
/// 类型:字符串
/// 内容:解码后的邮件的内容
/// </returns>
/// <remarks>得到解码后的邮件的内容</remarks>
private string GetDecodeMailContent(string encodingContent)
{
string strContent = encodingContent.Trim();
string strEncode = null;
int iStart = strContent.IndexOf(“Base64″);
if(iStart == -1)
throw new Pop3Exception(“邮件内容不是Base64编码,请检查”);
else
{
strEncode = strContent.Substring(iStart + 6,strContent.Length – iStart – 6);
try
{
return SX.Encode.TransformToString(strEncode);
}
catch(SX.EncodeException exc)
{
throw new Pop3Exception(exc.Message);
}
}
}
#endregion
/// <summary>
/// 与主机建立连接
/// </summary>
/// <returns>
/// 类型:布尔
/// 内容:连接结果(true为连接成功,false为连接失败)
/// </returns>
/// <remarks>与主机建立连接</remarks>
public bool Connect()
{
if(mstrHost == null)
throw new Exception(“请提供SMTP主机名称或IP地址!”);
if(mintPort == 0)
throw new Exception(“请提供SMTP主机的端口号”);
try
{
mtcpClient = new TcpClient(mstrHost,mintPort);
mnetStream = mtcpClient.GetStream();
m_stmReader = new StreamReader(mtcpClient.GetStream());
string strMessage = m_stmReader.ReadLine();
if(CheckCorrect(strMessage,”+OK”) == true)
return true;
else
return false;
}
catch(SocketException exc)
{
throw new Pop3Exception(exc.ToString());
}
catch(NullReferenceException exc)
{
throw new Pop3Exception(exc.ToString());
}
}
#region Pop3命令
/// <summary>
/// 执行Pop3命令,并检查执行的结果
/// </summary>
/// <param name=”command”>Pop3命令行</param>
/// <returns>
/// 类型:字符串
/// 内容:Pop3命令的执行结果
/// </returns>
private string ExecuteCommand(string command)
{
string strMessage = null; //执行Pop3命令后返回的消息
try
{
//发送命令
WriteToNetStream(ref mnetStream,command);
//读取多行
if(command.Substring(0,4).Equals(“LIST”) || command.Substring(0,4).Equals(“RETR”) || command.Substring(0,4).Equals(“UIDL”)) //记录STAT后的消息(其中包含邮件数)
{
strMessage = ReadMultiLine();
if(command.Equals(“LIST”)) //记录LIST后的消息(其中包含邮件数)
mstrStatMessage = strMessage;
}
//读取单行
else
strMessage = m_stmReader.ReadLine();
//判断执行结果是否正确
if(CheckCorrect(strMessage,”+OK”))
return strMessage;
else
return “Error”;
}
catch(IOException exc)
{
throw new Pop3Exception(exc.ToString());
}
}
/// <summary>
/// 在Pop3命令中,LIST、RETR和UIDL命令的结果要返回多行,以点号(.)结尾,
/// 所以如果想得到正确的结果,必须读取多行
/// </summary>
/// <returns>
/// 类型:字符串
/// 内容:执行Pop3命令后的结果
/// </returns>
private string ReadMultiLine()
{
string strMessage = m_stmReader.ReadLine();
string strTemp = null;
while(strMessage != “.”)
{
strTemp = strTemp + strMessage;
strMessage = m_stmReader.ReadLine();
}
return strTemp;
}
//USER命令
private string USER(string user)
{
return ExecuteCommand(“USER ” + user) + “\r\n”;
}
//PASS命令
private string PASS(string password)
{
return ExecuteCommand(“PASS ” + password) + “\r\n”;
}
//LIST命令
private string LIST()
{
return ExecuteCommand(“LIST”) + “\r\n”;
}
//UIDL命令
private string UIDL()
{
return ExecuteCommand(“UIDL”) + “\r\n”;
}
//NOOP命令
private string NOOP()
{
return ExecuteCommand(“NOOP”) + “\r\n”;
}
//STAT命令
private string STAT()
{
return ExecuteCommand(“STAT”) + “\r\n”;
}
//RETR命令
private string RETR(int number)
{
return ExecuteCommand(“RETR ” + number.ToString()) + “\r\n”;
}
//DELE命令
private string DELE(int number)
{
return ExecuteCommand(“DELE ” + number.ToString()) + “\r\n”;
}
//QUIT命令
private void Quit()
{
WriteToNetStream(ref mnetStream,”QUIT”);
}
/// <summary>
/// 收取邮件
/// </summary>
/// <param name=”user”>用户名</param>
/// <param name=”password”>口令</param>
/// <returns>
/// 类型:字符串数组
/// 内容:解码前的邮件内容
/// </returns>
private string[] ReceiveMail(string user,string password)
{
int iMailNumber = 0; //邮件数
if(USER(user).Equals(“Error”))
throw new Pop3Exception(“用户名不正确!”);
if(PASS(password).Equals(“Error”))
throw new Pop3Exception(“用户口令不正确!”);
if(STAT().Equals(“Error”))
throw new Pop3Exception(“准备接收邮件时发生错误!”);
if(LIST().Equals(“Error”))
throw new Pop3Exception(“得到邮件列表时发生错误!”);
try
{
iMailNumber = GetMailNumber(mstrStatMessage);
//没有新邮件
if(iMailNumber == 0)
return null;
else
{
string[] strMailContent = new string[iMailNumber];
for(int i = 1 ; i <= iMailNumber ; i++)
{
//读取邮件内容
strMailContent[i - 1] = GetDecodeMailContent(RETR(i));
}
return strMailContent;
}
}
catch(Pop3Exception exc)
{
throw new Pop3Exception(exc.ToString());
}
}
#endregion

/// <summary>
/// 收取邮件
/// </summary>
/// <param name=”user”>用户名</param>
/// <param name=”password”>口令</param>
/// <returns>
/// 类型:字符串数组
/// 内容:解码前的邮件内容
/// </returns>
///<remarks>收取邮箱中的未读邮件</remarks>
public string[] Receive(string user,string password)
{
try
{
return ReceiveMail(user,password);
}
catch(Pop3Exception exc)
{
throw new Pop3Exception(exc.ToString());
}
}
/// <summary>
/// 断开所有与服务器的会话
/// </summary>
/// <remarks>断开所有与服务器的会话</remarks>
public void DisConnect()
{
try
{
Quit();
if(m_stmReader != null)
m_stmReader.Close();
if(mnetStream != null)
mnetStream.Close();
if(mtcpClient != null)
mtcpClient.Close();
}
catch(SocketException exc)
{
throw new Pop3Exception(exc.ToString());
}
}
/// <summary>
/// 删除邮件
/// </summary>
/// <param name=”number”>邮件号</param>
public void DeleteMail(int number)
{
//删除邮件
int iMailNumber = number + 1;
if(DELE(iMailNumber).Equals(“Error”))
throw new Pop3Exception(“删除第” + iMailNumber.ToString() + “时出现错误!”);
}
}
}
95.报表相关
/*
using CrystalDecisions.CrystalReports.Engine;
using CrystalDecisions.Shared;
*/
2、水晶报表的两种格式
1)pull模式,不利用DataSet,直接从数据库中取出数据
2) push模式,使用DataSet,利用它进行数据的加载和处理等
3. 水晶报表使用的库
1)水晶报表的引擎(CREnging.dll),作用:合并数据,装换格式
2)水晶报表设计器(CRDesigner.dll),作用:设计标题,插入数据等
3)水晶报表查看控件(CRWebFormViewer.DLL)
4)需要引入的命名空间
using CrystalDecisions.CrystalReports.Engine;
using CrystalDecisions.Shared;
4、Pull模式下使用水晶报表
1)创建rpt文件
2)拖放CrystalReportViewer
3)绑定
5、读取水晶报表文件
private void ReadCRV(cryatalReportViewer crv)
{
openFileDialog dlg=new OpenFileDialog();
dlg.Title=”打开水晶报表文件”;
dlg.Filter=”水晶报表文件(*.rpt)|*.rpt|所有文件|*.*”;
if(dlg.showDialog()==DialogResult.OK)
{
crv.ReportSource=dlg.FileName;
}
}
6. B/S下读取报表的文件
private void ReadCRV(cryatalReportViewer crv,File file)
{
string strName=file.PostedFile.FileName;
if(strName.Trim()!=”")
{
crv.ReportSource=strName
Session["fileName"]=strName;
}
}
在B/S中要防止数据源的丢失
priavte void Page_Load(object sender,System.EventArgs e)
{
if(Session["fileName"]!=null)
{
crv.ReportSource=Session["fileName"].ToString();
}
}
7. 假如直接从数据库中读取数据,采用PULL模式可能出现错误(登录的用户名和密码不对)
private void ReadCRV(CrystalReportViewer crv,CrystalReport cr)
{
ReportDocument reportDoc=new ReportDocument();
reportDoc.Load(Server.MapPath(cr));//要加载的rpt文件的名字
//解决登录的问题
TableLogOnInfo logonInfo = new TableLogOnInfo();
foreach(Table tb in ReportDoc.Database.Tables)
{
logonInfo=tb.LogOnInfo;
logonInfo.ConnectionInfo.ServerName=”(loacl)”;
logonInfo.ConnectionInfo.DatabaseName=”Pubs”;
logonInfo.ConnectionInfo.UserId=”sa”;
logonInfo.ConnectionInfo.Password=”";
tb.ApplyLogOnInfo(logonInfo);
}
crv.ReportSource=reportDoc;
}
8. 采用Push模式,直接在数据源读取
private void BindReport(CrystalReportViewer crv)
{
string strProvider=”Server=(local);DataBase=pubs;uid=sa;pwd=”;
CrystalReport cr=new CrystalReport();
DataSet ds=new DataSet();
SqlConnection conn=new SqlConnection(strProvider);
conn.open();
string strSql=”select * from jobs”;
SqlDataAdapter dap=new SqlDataAdapter(strSql,conn);
adp.Fill(ds,”jobs”);
cr.SetDataSource(ds);
crv.ReportSource=cr;
}
9. 导出水晶报表的文件
private void ExportCrv(CrystalReport cr)
{
DiskFileDestionOptions dOpt=new DiskFileDestionOptions();
cr.ExportOptions.ExportDestinationType=ExportDestinationType.DiskFile();
cr.ExportOptions.ExportFormatType= ExportFormatType.PortableDocFormat;
dOpt.DiskFileName=”C:\output.pdf”;
cr.ExportOptions.DestinationOptions=dOpt;
cr.Export();

}
private void ExportCrv(CrystalReport cr,string strType,string strPath)
{
DiskFileDestionOptions dOpt=new DiskFileDestionOptions();
cr.ExportOptions.ExportDestinationType=ExportDestinationType.DiskFile();
switch(strType)
{
case “RTF”:
cr.ExportOptions.ExportFormatType=ExportFormatType.RichText;
dOpt.DiskFileName=strPath;
break;
case “PDF”:
cr.ExportOptions.ExportFormatType=ExportFormatType.PortableDocFormat;
dOpt.DiskFileName=strPath;
break;
case “DOC”:
cr.ExportOptions.ExportFormatType=ExportFormatType.WordForWindows;
dOpt.DiskFileName=strPath;
break;
case “XLS”:
cr.ExportOptions.ExportFormatType=ExportFormatType.Excel;
dOpt.DiskFileName=strPath;
break;
default;
break;

}
cr.ExportOptions.DestinationOptions=dOpt;
cr.Export();
}
10 B/S下水晶报表的打印
priavte void PrintCRV(CrystalReport cr)
{
stringstrPrinterName=@”printName”;
PageMargins margins=cr.PrintOptions.PageMargins;
margins.bottomMargin = 250;
margins.leftMargin = 350;
margins.rightMargin = 350;
margins.topMargin = 450;
cr.PrintOptions.ApplyPageMargins(margins);
cr.PrintOptions.printerName=strPrinterName;
cr.PrintToPrinter(1,false,0,0)//参数设置为0,表示打印所用页
}
96.全屏幕截取
/*
using System.Drawing.Drawing2D;
using System.Runtime.InteropServices;
using System.Collections;
using System.Drawing.Imaging;
using System.Threading;
*/
[DllImport("gdi32.dll")]
private static extern int BitBlt(IntPtr hdcDest,int nXDest,int nYDest,int nWidth,int nHeight,IntPtr hdcSrc,int nXSrc,int nYSrc,UInt32 dwRop);
//this.Hide();//如果你不想截取的图象中有此应用程序
//Thread.Sleep(1000);
Rectangle rect = new Rectangle();
rect = Screen.GetWorkingArea(this);//获得当前屏幕的大小
Graphics g = this.CreateGraphics();
//创建一个以当前屏幕为模板的图象
Image myimage = new Bitmap(rect.Width, rect.Height, g);
//第二种得到全屏坐标的方法
// Image myimage = new Bitmap(Screen.PrimaryScreen.Bounds.Width,Screen.PrimaryScreen.Bounds.Height,g);
//创建以屏幕大小为标准的位图
Graphics gg = Graphics.FromImage(myimage);
IntPtr dc = g.GetHdc();//得到屏幕的DC
IntPtr dcdc = gg.GetHdc();//得到Bitmap的DC
BitBlt(dcdc, 0, 0, rect.Width, rect.Height, dc, 0, 0, 13369376);
//调用此API函数,实现屏幕捕获
g.ReleaseHdc(dc);//释放掉屏幕的DC
gg.ReleaseHdc(dcdc);//释放掉Bitmap的DC
myimage.Save(Application.StartupPath + @”\bob.jpg”,    ImageFormat.Jpeg);//以JPG文件格式来保存
this.Show();
97.区域截幕
/*
using System.Drawing.Drawing2D;
using System.Runtime.InteropServices;
using System.Collections;
using System.Drawing.Imaging;
using System.Threading;
[DllImport("gdi32.dll")]
public static extern IntPtr CreateDC(
string lpszDriver,        // driver name
string lpszDevice,        // device name
string lpszOutput,        // not used; should be NULL
Int64 lpInitData  // optional printer data
);

[DllImport("gdi32.dll")]
public static extern IntPtr CreateCompatibleDC(
IntPtr hdc // handle to DC
);

[DllImport("gdi32.dll")]
public static extern int GetDeviceCaps(
IntPtr hdc,     // handle to DC
GetDeviceCapsIndex nIndex   // index of capability
);
[DllImport("gdi32.dll")]
public static extern IntPtr CreateCompatibleBitmap(
IntPtr hdc,        // handle to DC
int nWidth,     // width of bitmap, in pixels
int nHeight     // height of bitmap, in pixels
);
[DllImport("gdi32.dll")]
public static extern IntPtr SelectObject(
IntPtr hdc,          // handle to DC
IntPtr hgdiobj   // handle to object
);
[DllImport("gdi32.dll")]
public static extern int BitBlt(
IntPtr hdcDest, // handle to destination DC
int nXDest,  // x-coord of destination upper-left corner
int nYDest,  // y-coord of destination upper-left corner
int nWidth,  // width of destination rectangle
int nHeight, // height of destination rectangle
IntPtr hdcSrc,  // handle to source DC
int nXSrc,   // x-coordinate of source upper-left corner
int nYSrc,   // y-coordinate of source upper-left corner
UInt32 dwRop  // raster operation code
);
[DllImport("gdi32.dll")]
public static extern int DeleteDC(
IntPtr hdc          // handle to DC
);
*/
public static Bitmap GetPartScreen(Point P1,Point P2,bool Full)
{
IntPtr hscrdc,hmemdc;
IntPtr hbitmap,holdbitmap;
int nx,ny,nx2,ny2;
nx=ny=nx2=ny2=0;
int nwidth, nheight;
int xscrn, yscrn;
hscrdc = CreateDC(“DISPLAY”, null, null, 0);//创建DC句柄
hmemdc = CreateCompatibleDC(hscrdc);//创建一个内存DC
xscrn = GetDeviceCaps(hscrdc, GetDeviceCapsIndex.HORZRES);//获取屏幕宽度
yscrn = GetDeviceCaps(hscrdc, GetDeviceCapsIndex.VERTRES);//获取屏幕高度
if(Full)//如果是截取整个屏幕
{
nx = 0;
ny = 0;
nx2 = xscrn;
ny2 = yscrn;
}
else
{
nx = P1.X;
ny = P1.Y;
nx2 =P2.X;
ny2 =P2.Y;
//检查数值合法性
if(nx<0)nx = 0;
if(ny<0)ny = 0;
if(nx2>xscrn)nx2 = xscrn;
if(ny2>yscrn)ny2 = yscrn;
}
nwidth = nx2 – nx;//截取范围的宽度
nheight = ny2 – ny;//截取范围的高度
hbitmap = CreateCompatibleBitmap(hscrdc, nwidth, nheight);//从内存DC复制到hbitmap句柄
holdbitmap = SelectObject(hmemdc, hbitmap);
BitBlt(hmemdc, 0, 0, nwidth, nheight,hscrdc, nx, ny,(UInt32)0xcc0020);
hbitmap = SelectObject(hmemdc, holdbitmap);
DeleteDC(hscrdc);//删除用过的对象
DeleteDC(hmemdc);//删除用过的对象
return Bitmap.FromHbitmap(hbitmap);//用Bitmap.FromHbitmap从hbitmap返回Bitmap
}
98.计算文件MD5值
/*
using System.IO;
using System.Security.Cryptography;
*/
string path = %%1;
FileStream fs = new FileStream(path,FileMode.Open,FileAccess.Read);
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
byte [] md5byte = md5.ComputeHash(fs);
int i,j;
StringBuilder sb = new StringBuilder(16);
foreach (byte b in md5byte)
{
i = Convert.ToInt32(b);
j = i >> 4;
sb.Append(Convert.ToString(j,16));
j = ((i << 4) & 0x00ff) >> 4;
sb.Append(Convert.ToString(j,16));
}
string %%2=sb.ToString();
99.计算获取文件夹中文件的MD5值
/*
using System.IO;
using System.Security.Cryptography;
using System.Collections;
*/
bool b=false;
string path = (%%2.LastIndexOf(“\\”) == %%2.Length – 1) ? %%2 : %%2 + “\\”;
string parent = Path.GetDirectoryName(%%1);
Directory.CreateDirectory(path + Path.GetFileName(%%1));
DirectoryInfo dir = new DirectoryInfo((%%1.LastIndexOf(“\\”) == %%1.Length – 1) ? %%1 : %%1 + “\\”);
FileSystemInfo[] fileArr = dir.GetFileSystemInfos();
Queue<FileSystemInfo> Folders = new Queue<FileSystemInfo>(dir.GetFileSystemInfos());
while (Folders.Count > 0)
{
FileSystemInfo tmp = Folders.Dequeue();
FileInfo f = tmp as FileInfo;
if (b && f == null)
{
DirectoryInfo d = tmp as DirectoryInfo;
Directory.CreateDirectory(d.FullName.Replace((parent.LastIndexOf(“\\”) == parent.Length – 1) ? parent : parent + “\\”, path));
foreach (FileSystemInfo fi in d.GetFileSystemInfos())
{
Folders.Enqueue(fi);
}
}
else
{
FileStream fs = new FileStream(f,FileMode.Open,FileAccess.Read);
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
byte [] md5byte = md5.ComputeHash(fs);
int i,j;
StringBuilder sb = new StringBuilder(16);
foreach (byte b in md5byte)
{
i = Convert.ToInt32(b);
j = i >> 4;
sb.Append(Convert.ToString(j,16));
j = ((i << 4) & 0x00ff) >> 4;
sb.Append(Convert.ToString(j,16));
}
string %%3=sb.ToString();
}
}

利用MSDTC进行分布式开发时报告“事务被明的或暗的被终止”

归类于C# 参与评论

利用MSDTC进行分布式开发时报告“事务被明的或暗的被终止”

利用MSDTC进行分布式开发时报告“事务被明的或暗的被终止”

最近利用COM+1.5开发一个系统,里边利用到了分布式事务。在开发机器和偶自己的虚拟机上测试正常,但是在测试服务器上测试报告“事务被明的或暗的终止”。PRB:利用MSDTC进行分布式开发时报告“事务被明的或暗的被终止” - 庸俗的上帝 - 庸俗的上帝具体症状为:System.Runtime.InteropServices.COMException (0x8004D00E): 此事务已明地或暗地被确认或终止

Server stack trace:
at System.Data.Common.ITransactionExport.Export(ITransaction transaction, UInt32& transactionCookie)
at System.Data.SqlClient.Transaction.GetTransactionCookie(Byte[] dtcAddr, ITransaction transaction, ITransactionExport& transactionExport, Byte[]& cookie, Int32& length)
at System.Data.SqlClient.SqlInternalConnection.EnlistNonNullDistributedTransaction(ITransaction transaction)
at System.Data.SqlClient.SqlInternalConnection.EnlistDistributedTransaction(ITransaction newTransaction, Guid newTransactionGuid)
at System.Data.SqlClient.SqlInternalConnection.EnlistDistributedTransaction()
at System.Data.SqlClient.SqlInternalConnection.Activate(Boolean isInTransaction)
at System.Data.SqlClient.SqlConnection.Open()
at Onest.IOS.UASM.UASMManager.Subscribe(String GatewayID, String Mobile, Int32 MobileType, String DestMobile, Int32 DestMobileType, String ServiceCode, String FeatureStr, Int32 SourceID, String Operator)
at System.Runtime.Remoting.Messaging.Message.Dispatch(Object target, Boolean fExecuteInContext)
at System.Runtime.Remoting.Messaging.StackBuilderSink.SyncProcessMessage(IMessage msg, Int32 methodPtr, Boolean fExecuteInContext)

Exception rethrown at [0]:
at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
at Onest.IOS.UASM.UASMManager.Subscribe(String GatewayID, String Mobile, Int32 MobileType, String DestMobile, Int32 DestMobileType, String ServiceCode, String FeatureStr, Int32 SourceID, String Operator)
at Onest.IOS.UASM.Facade.UASMFacade.SubscribeNoDSMP(String GatewayID, String Mobile, Int32 MobileType, String DestMobile, Int32 DestMobileType, String ServiceCode, String FeatureStr, Int32 SourceID, String Operator)
at System.Runtime.Remoting.Messaging.Message.Dispatch(Object target, Boolean fExecuteInContext)
at System.Runtime.Remoting.Messaging.StackBuilderSink.SyncProcessMessage(IMessage msg, Int32 methodPtr, Boolean fExecuteInContext)

Exception rethrown at [1]:
at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
at Onest.IOS.UASM.Facade.UASMFacade.SubscribeNoDSMP(String GatewayID, String Mobile, Int32 MobileType, String DestMobile, Int32 DestMobileType, String ServiceCode, String FeatureStr, Int32 SourceID, String Operator)
at UASMTest.Form1.btSubscribe_Click(Object sender, EventArgs e)
顺便说一句,偶的系统环境为:测试服务器为单独的windows2003服务器;数据库服务器为公司统一的数据库服务器,并且被加入到公司的域中;偶本人的计算机虽然没有加入到域,但偶在访问数据库服务时让其记住了密码,俺的虚拟机也是一样PRB:利用MSDTC进行分布式开发时报告“事务被明的或暗的被终止” - 庸俗的上帝 - 庸俗的上帝。后来查证就是这个问题迷惑了偶好几天PRB:利用MSDTC进行分布式开发时报告“事务被明的或暗的被终止” - 庸俗的上帝 - 庸俗的上帝
经过在微软kb的艰苦的搜索工作,终于发现,原来在windows2003中为了增强其安全性,微软调整了MSDTC RPC通讯的安全策略,偶自己的开发机器可以进行事务操作是因为应用程序直接继承了偶得身份到服务器进行验证,所以可以正常运行;而测试服务器则没有权限进行相关的操作。
解决方案:修改注册表:LOCAL_Machine\Software\Microsoft\MSDTC下建立DBWrod的子项TurnOffRPCSecurity,并且设置值为1,重启服务器即可。

C#事务异常TransactionScope Troubleshooting

归类于C# 参与评论

只要涉及到数据库的操作,那么使用事务就是难免的。如果我们使用LINQ to SQL作为数据访问层,那么LINQ提供的SubmitChanges()方法自身就包含了对事务的处理。当然,我们也可以利用System.Data.Common.DbTransaction对事务进行处理,我们可以调用DataContext中Connection的方法BeginTransaction()启动事务,然后根据情况进行回滚或提交。例如是这样一段代码:

LinqSampleDataContext context = new LinqSampleDataContext();                 System.Data.Common.DbTransaction trans = null;     try    {        context.Connection.Open();        trans = context.Connection.BeginTransaction();        context.Transaction = trans;            context.Employees.InsertOnSubmit(emp);                     context.SubmitChanges();            trans.Commit();     }     catch (Exception ex)     {        if (trans != null)        {            trans.Rollback();        }     }

然而,当我们在使用LINQ to SQL中时,往往会同时使用多个DataContext,此时我们就需要使用TransactionScope。例如:

using (TransactionScope scope = new TransactionScope(TransactionScopeOption.RequiresNew))     {         try        {               for (int i = 0; i < nominees.Count; ++i)             {                 Backup newBackup = nominees[i];                 Ticket ticket = tickets[i];                   //update the information of ticket                 //mainly add the information of employee;                 ticket.EmployeeID = newBackup.EmployeeID;                 ticket.HaveNominated = true;                 ticket.IsConfirmedByManager = true;                 ticket.Status = TicketStatus.Enroll.ToString();                   ticketAccessor.Update(ticket);             }               //update the IsSubmit of backup;             ChangeSubmitStatue(backup);               //remove the record of nominee in backup table             Delete(nominees);         }         catch (Exception ex)         {             ThrowHelper.ThrowBackupException("Finalizing occurs an error. The transcation will be rollback.");             return false;         }           scope.Complete();     }

 

代码中,分别涉及到Update, Delete等操作,因此我们势必需要用事务,保证数据整体提交或整体回滚。在使用事务的时候,有一些前置条件是必备的。例如启动Distributed Transaction Coordinator服务,否则,就会抛出System.Data.SqlClient.SqlException异常,信息为:”MSDTC on server ‘{Server Name}’ is unavailable.”。是的,很多资料都是这样描述的。然而,现实并没有这么简单。我们首先得考虑运行代码的机器是否与数据库所在的机器是同一台。这里所谓的启动Distributed Transaction Coordinator服务,实际上是要启动数据库服务器的服务。如果数据库与代码服务器是同一台,通过这样的设置就没有错误了。
当数据库与代码服务器分属两台机器呢?同样运行如上的代码,就会抛出System.Transactions.TransactionManagerCommunicationException异常。异常信息为:”Network access for Distributed Transaction Manager (MSDTC) has been disabled. Please enable DTC for network access in the security configuration for MSDTC using the Component Services Administrative tool.”
这是一种通信错误,原因在于两台服务器之间的安全配置禁止了分布式事务。解决办法是在运行代码的服务器上,配置Component Services。方法如下:
1、在Run运行窗口中,输入dcomcnfg命令,这样就可以打开Component Services。
2、选择Component Services->Computers->My Computer;
3、右键单击My Computer,在弹出的快捷菜单中,选择“Properties”,然后点击MSDTC tab;
4、在MSDTC tab中,点击Security Configuration按钮;
5、在弹出的对话框中参照下表的建议进行设置:

 

 

Configuration Option Default Value Recommended Value
Network DTC Access Disabled Enabled
Client and Administration
Allow Remote Clients Disabled Disabled
Allow Remote Administration Disabled Disabled
Transaction Manager Communication
Allow Inbound Disabled Enabled
Allow Outbound Disabled Enabled
Mutual Authentication Required Enabled Enabled if all remote machines are running Win2K3 SP1 or XP SP2 or higher, and are configured with “Mutual Authentication Required”.
Incoming Caller Authentication Required Disabled Enabled if running MSDTC on cluster.
No Authentication Required Disabled Enabled if remote machines are pre-Windows Server 2003 SP1 or pre- Windows XP SP2.
Enable TIP Disabled Enabled if running the BAM Portal.
Enable XA Transactions Disabled Enabled if communicating with an XA based transactional system such as when communicating with IBM WebSphere MQ using the MQSeries adapter.

最后的设置如截图:

如果操作系统是Windows 2003,通常默认的设置就是正确的。不过我们在编写程序时,不管是Unit Test,还是其他测试,最频繁的还是在本机上运行。如果操作系统是Windows XP,就不得不进行这样的设置了。

注: 此贴中没写在防火墙中加入msdtc.exe,值得商榷

浅谈C#中的枚举

归类于C# 参与评论

枚举类型是一种的值类型,它用于声明一组命名的常数。
(1)枚举的声明:枚举声明用于声明新的枚举类型。
    访问修辞符 enum 枚举名:基础类型
{
枚举成员
}
基础类型必须能够表示该枚举中定义的所有枚举数值。枚举声明可以显式地声明 byte、sbyte、short、ushort、int、uint、long 或 ulong 类型作为对应的基础类型。没有显式地声明基础类型的枚举声明意味着所对应的基础类型是 int。
(2)枚举成员
        枚举成员是该枚举类型的命名常数。任意两个枚举成员不能具有相同的名称。每个枚举成员均具有相关联的常数值。此值的类型就是枚举的基础类型。每个枚举成员的常数值必须在该枚举的基础类型的范围之内。
示例:
public enum TimeofDay:uint
{
Morning=-3,
Afternoon=-2,
Evening=-1
}
产生编译时错误,原因是常数值 -1、-2 和 –3 不在基础整型 uint 的范围内。
(3)枚举成员默认值 
在枚举类型中声明的第一个枚举成员它的默值为零。
以后的枚举成员值是将前一个枚举成员(按照文本顺序)的值加 1 得到的。这样增加后的值必须在该基础类型可表示的值的范围内;否则,会出现编译时错误。
示例:
public enum TimeofDay:uint
{
Morning,
Afternoon,
Evening
}
Morning的值为0,Afternoon的值为1,Evening的值为2。
(4)为枚举成员显示赋值
        允许多个枚举成员有相同的值.
没有显示赋值的枚举成员的值,总是前一个枚举成员的值+1.
示例
public enum Number
{
a=1,
b,
c=1,
d
}
b的值为2,d的值为2.
注意:以上枚举值都不能超过它的基础类型范围。否则会报错.
(5)枚举类型与基础类型的转换
     基础类型不能隐式转换为枚举类型
枚举类型也不能隐式转换为基础类型
示例:
public enum Number
{
a,
b,
c,
d
}

class Test
{
public static void Main()
{
int i=Number.a;//错误,要强制类型转换(int)Number.a
Number n;
n=2            //错误,要强制类型转换(Number)2
}
}
(6)System.Enum类型
    System.Enum 类型是所有枚举类型的抽象基类,并且从 System.Enum 继承的成员在任何枚举类型中都可用。
System.Enum 本身不是枚举类型。相反,它是一个类类型,所有枚举类型都是从它派生的。
System.Enum 从类型 System.ValueType派生
(7)使用枚举类型
using System;
public enum TimeofDay
{
Morning,
Afternoon,
Evening
}

class Test
{
static void WriteGreeting(TimeofDay timeofDay)
{
switch(timeofDay)
{
case TimeofDay.Morning:
Console.WriteLine(“good morning”);
break;
case TimeofDay.Afternoon:
Console.WriteLine(“good afternoon”);
break;
case TimeofDay.Evening:
Console.WriteLine(“good evening”);
break;
}
}
static void Main()
{
WriteGreeting(TimeofDay.Morning);
WriteGreeting(TimeofDay.Evening);
WriteGreeting(TimeofDay.Afternoon);
}
}

c#中的各种符号解释整理【不断更新中】

归类于C# 参与评论

单个符号

由于在C#中这些符号不仅单用,还有各种组合使用情况,因此这里首先介绍它们单用的情况。

1. ~

逐位求反,例如: ~1=0,~0=1,~00010=11101;

另一种解释:按位求补符。这个符号可能比较少见,不过它确实很有用。1的32位表示为0000 0000 0000 0000 0000 0000 0000 0001,那么int a=~1实际为-2,即1111 1111 1111 1111 1111 1111 1111 1110。另外,~在List的BinarySearch中将会使你的操作方便很多。在这个二分查找的实现中,如果查找的元素不在集合中,它会返回一个负值,技巧就在这里,这个数的求补结果是下一个比查找元素大的元素的位置,如果没有更大的元素,那么它表示元素总数。这个技巧使得我们在插入新的元素的时候方便很多。

 

以下为引用的内容:

static void main()
{
List<string> list = new List<string>();
int search;
list.Add(“public”);
list.Add(“protected”);
list.Add(“private”);
list.Sort();
search = list.BinarySearch(“protected internal”);
if (search < 0)
{
list.Insert(~search, “protected internal”);
}
foreach (string accessModifier in list)
{
Console.WriteLine(accessModifier);
}
}

输出结果为:

private protected protected internal public

2. !,@,#和$

!非逻辑运算符,这里不多讲。@常用在字符串开头,它可以告诉编译器忽略转义符,从而可以很方便的将一些特殊字符按用户表达意愿输出,另外在Aspx.Net中这个字符常和其他字符混合使用。#和$微软暂时没盯上(当然如果你觉得C#用到了#的话也行)。不过$符号相信很多人都熟悉,大名鼎鼎的JQuery使得这个符号处处可见,不过不保证以后微软也插上一脚。一下是$符号在js中的意思:

1、首先可以用来表示变量,
比如变量 var s=’asdsd’或var $s=’asdasd’;
2、在正则表达式中,它可以匹配结尾
/sa$/.test(string)
匹配string字符串中的sa,比如string=’125sa’则匹配,string=’125sa21′则不匹配
正则表达式很复杂,这里只是简单的说说。
3、由于受prototype.js(老外写的框架,用于将一些常用的函数封装,方便操作)的影响,
现在很多人都用 $来表示一个查找对象的函数,
$=function (id) { return (typeof (id)==’object’)?id:document.getElementById(id); };
其实就是一个自定义函数,用$只是简单,其实用其它字符也是一样的,
f=function (id) { return (typeof (id)==’object’)?id:document.getElementById(id); };也可以
其中参数id是html文档中的id,
比如<div id=’ss’></div>
则obj=$(‘ss’)就是引用的这个id=’ss’的对象

 

4.%,^,&,*,(),-,+,=,{},|和\

这些符号基本都是常见符号符号,因此这里也只做简单解释。%是求余运算符,^是异或位运算符,&则是按位与运算符,另外|是按位或运算符。*既可以用作乘法符号,还可以表示为指针。()和{}用于对象中,前者一方面表示函数参数区域,另一方面在强制类型转换时表示把一种类型强制转换为括号中的类型,除此,它还用来包裹运算部分从而制定运算优先级,后者则长表示代码片段作用域,它既可以用于指代命名空间中的有哪些类或类中包括哪些属性方法等,还可以用于在协助C#中某些特殊操作时指定其作用块,如fixed,using等等,另外在字符串格式化中,{}和数字组合表示目标字符串中待替换子串位置, e.g. String.Format(“{0} + {1}={3}”, 1,2,3)。+通常表示相加数学运算符,=则长用来表示赋值操作。另外,这些操作符可以组合来表示不同含义,后面将会详细说明这一部分。\用于转义符的开始,如\n表示换行。

5.[]

这个符号同样常见,它通常有三种使用方式,一个是用于数组中表示索引位置,一种为添加类型的特性时使用,另外它也常常和this关键字在类中配合使用来形成类索引。

以下为引用的内容:

class Some
{
int this[string item]
{
get
{
if(item==”a”)return 1;
return 0;
}
}
}

6. :,;’,”,’,<,,,>,.,/,?

:目前没有单独使用情况,后面会讲到它的组合使用,;处处可见,C#不像VB,它用;表示语句的结束。”包裹字符串,’则包裹单个字符。<和>分别为大和小的逻辑运算符,,用于分隔参数,.用于表示对象成员选择器或小数点。/则表示除以的数学运算符。?单个常用于表示可空的值类型,int? a=null,它也可以与很多字符组合使用来表示不同意义。

符号组合

好了,键盘上的符号键基本介绍完毕,在C#中,符号更为强大的一面是它们之间不同组合产生不同的意义,这里将会对此作出一些简单介绍。

1. 单个字符重复组合

这里有?和+,-,&,|,<,>以及=。??同样用于泛型中,它在值类型数据操作时非常有用,它可以在值类型为空时指定默认值,e.g. int a=someNullable??100;它表示如果someNullable不为空时则将其值赋给a,否则将100赋值给a,另外你也可以参考这篇文章。++和–表示自加或减1。&&,||和==则表示逻辑关系的且,或和相等。<<和>>则分别表示左右移位操作。最后//表示单行注释。

1. 数学运算符,位运算符,逻辑运算符和=的组合使用。

和C/C++中类似,C#通过这两种符号的组合简化了程序员在常见数学运算时的输入。如+=,-=,*=,/=,%=,还有&=,~=,|=等,它是一个数自身与某个数做相应数学操作的结果。如a+=10完整形式为:a=a+10。逻辑运算符和=则表示或的关系,如>=表示大于或等于。

2. ?和:组合

这个组合的符号不是紧挨着的,不过他们必须组合使用。这里?和:组成条件表达式,int c= a==b?a:b; 它的存在同样简化程序员代码。

3. =>组合以及<>配对

=>组合是3.0以后加入的,它也是构成Lamda表达使得部分,它使得匿名函数的书写更加简洁。通常它前面会包含有表达式参数部分,后面则是表达式的主体部分。<>则在泛型中大量使用,它用来包裹类型参数。

4. ASPX页面中的符号组合

在ASPX中组合符号很多,一般基本都是左右尖括号和其他符号组合来表示服务器端脚本代码,从而达到插入服务器代码的目的。这里仅列出一些常见符号组合。

首先<%@ 和%>用来表示ASPX 2.0的Page指令,它一般出现在页面顶部。在ASPX.NET页面或用户控件中有11个指令(注1),指令格式为:<%@ [Directive] [Attribute=Value] %>。

<%=%>用于在HTML代码中插入.NET代码片段。在Aspx.Net MVC中这个字符组合非常常见,这点类似以前的ASP,这也是有些程序员认为MVC退回到ASP时代的一个原因。

总结

符号在很多时候不仅比字符更加简洁的表达意思,而且它还更形象和直观,这也是符号在.net中出现的一个原因。不过符号并不是越多越好,所谓过犹不及,太多太复杂的符号有时候反而会让程序员产生混淆和误解。所以目前.NET中出现的符号数量并不是太多,并且未来.NET中符号应该是基本固定的。不过这并不妨碍微软在适当的时候添加一些新的,有用的符号。比如有人在展望.NET 5.0的时候曾提到目前微软推出的Vedea语言的一个很不错的特性:绑定,它的符号为:textbox.Text := slider.Value; 这意味着当Value改变的时候,Text也会相应改变。而双向绑定的语法则有所不同:textbox.Text :=: slider.Value; 相信这个新的符号如果加入到.NET中来一定会让我们的代码比以前更加方便的!同时也期待类似的能简化我们程序员并且形象,直观的新特性符号能在未来出现。


补充:

“@”

@符号是特殊而又实用的C#符号.

比如它在string中的应用.

1、字符@表示,其后的字符串是个“逐字字符串”(verbatim string). // 这个说法来自C# Primer 中文版(Stanley B. Lippman, 侯捷/陈硕合译)

2、对于逐字字符串字面变量(verbatim string literal),我们不再需要使用“转义序列”就可以指定反斜线之类的特殊字符.@的这个特点使得在表示文件路径时很方便.如:string str = @”C:Test.txt”;

3、另外一点,用@表示的字符串能够跨越数行.这数行之内的空白字符(White Space)都会保留在字符串里.这样便能允许存储和生成带有格式的文本块.本文发表于www.bianceng.cn如:string strText = @”Line1Line2Line3″;有意思的是如果在VS.NET2003中当你输入完第一行(string strText = @”Line1)换行后,光标会自动到第二行最开头 ^_^.很智能化、人性化的判断.

4、不知道大家在最初看到@的功能时有没有想,如果“转义序列”()在字符串中“失效”,那么想包含一个双引号(“),怎么办?我找到了答案.方法很简单.在双引号之前再加一个双引号即可.如:string str = @”"”Great!”"Said Allen Lee”;

5、这仅仅是@在字符串中的用法,有机会再去看看@的其他东东.

.Net线程问题解答 C# WinForm 多线程学习文档

归类于C# 参与评论

把遇到过的对.Net线程的一些问题和误解集中起来和大家分享,也希望大家能一起补充,热烈欢迎讨论


目录


基础篇

怎样创建一个线程
受托管的线程与 Windows线程
前台线程与后台线程
名为BeginXXX和EndXXX的方法是做什么用的
异步和多线程有什么关联

WinForm多线程编程篇

我的多线程WinForm程序老是抛出InvalidOperationException ,怎么解决?
Invoke,BeginInvoke干什么用的,内部是怎么实现的
每个线程都有消息队列吗?
为什么Winform不允许跨线程修改UI线程控件的值
有没有什么办法可以简化WinForm多线程的开发

线程池

线程池的作用是什么?
所有进程使用一个共享的线程池,还是每个进程使用独立的线程池?
为什么不要手动线程池设置最大值?
.Net线程池有什么不足?

同步

CLR怎样实现lock(obj)锁定?
WaitHandle是什么,他和他的派生类怎么使用
什么是用双锁实现Singleton,为什么要这样做,为什么有人说双锁检验是不安全的
互斥对象(Mutex)、事件(Event)对象与lock语句的比较

什么时候需要锁定

只有共享资源才需要锁定
把锁定交给数据库
了解你的程序是怎么运行的
业务逻辑对事务和线程安全的要求
计算一下冲突的可能性
请多使用lock,少用Mutex

Web和IIS

应用程序池,WebApplication,和线程池之间有什么关系
Web页面怎么调用异步WebService

 

基础篇

 

怎样创建一个线程

我只简单列举几种常用的方法,详细可参考.Net多线程总结(一)

一)使用Thread类

ThreadStart threadStart=new ThreadStart(Calculate);//通过ThreadStart委托告诉子线程讲执行什么方法,这里执行一个计算圆周长的方法
Thread thread=new Thread(threadStart);
thread.Start(); //启动新线程public void Calculate(){
double Diameter=0.5;
Console.Write(“The perimeter Of Circle with a Diameter of {0} is {1}”Diameter,Diameter*Math.PI);
}

 

二)使用Delegate.BeginInvoke

delegate double CalculateMethod(double Diameter); //申明一个委托,表明需要在子线程上执行的方法的函数签名
static CalculateMethod calcMethod = new CalculateMethod(Calculate);//把委托和具体的方法关联起来
static void Main(string[] args)
{
//此处开始异步执行,并且可以给出一个回调函数(如果不需要执行什么后续操作也可以不使用回调)
calcMethod.BeginInvoke(5, new AsyncCallback(TaskFinished), null);
Console.ReadLine();
}//线程调用的函数,给出直径作为参数,计算周长
public static double Calculate(double Diameter)
{
return Diameter * Math.PI;
}

//线程完成之后回调的函数
public static void TaskFinished(IAsyncResult result)
{
double re = 0;
re = calcMethod.EndInvoke(result);
Console.WriteLine(re);
}

 

三)使用ThreadPool.QueueworkItem

WaitCallback w = new WaitCallback(Calculate);
//下面启动四个线程,计算四个直径下的圆周长
ThreadPool.QueueUserWorkItem(w, 1.0);
ThreadPool.QueueUserWorkItem(w, 2.0);
ThreadPool.QueueUserWorkItem(w, 3.0);
ThreadPool.QueueUserWorkItem(w, 4.0);
public static void Calculate(double Diameter)
{
return Diameter * Math.PI;
}

下面两条来自于http://www.cnblogs.com/tonyman/archive/2007/09/13/891912.html

  受托管的线程与 Windows线程

必须要了解,执行.NET应用的线程实际上仍然是Windows线程。但是,当某个线程被CLR所知时,我们将它称为受托管的线程。具体来说,由受 托管的代码创建出来的线程就是受托管的线程。如果一个线程由非托管的代码所创建,那么它就是非托管的线程。不过,一旦该线程执行了受托管的代码它就变成了 受托管的线程。

一个受托管的线程和非托管的线程的区别在于,CLR将创建一个System.Threading.Thread类的实例来代表并操作前者。在内部实现中,CLR将一个包含了所有受托管线程的列表保存在一个叫做ThreadStore地方。

CLR确保每一个受托管的线程在任意时刻都在一个AppDomain中执行,但是这并不代表一个线程将永远处在一个AppDomain中,它可以随着时间的推移转到其他的AppDomain中。

从安全的角度来看,一个受托管的线程的主用户与底层的非托管线程中的Windows主用户是无关的。
  前台线程与后台线程

启 动了多个线程的程序在关闭的时候却出现了问题,如果程序退出的时候不关闭线程,那么线程就会一直的存在,但是大多启动的线程都是局部变量,不能一一的关 闭,如果调用Thread.CurrentThread.Abort()方法关闭主线程的话,就会出现ThreadAbortException 异常,因此这样不行。
后来找到了这个办法: Thread.IsBackground 设置线程为后台线程。

msdn对前台线 程和后台线程的解释:托管线程或者是后台线程,或者是前台线程。后台线程不会使托管执行环境处于活动状态,除此之外,后台线程与前台线程是一样的。一旦所 有前台线程在托管进程(其中 .exe 文件是托管程序集)中被停止,系统将停止所有后台线程并关闭。通过设置 Thread.IsBackground 属性,可以将一个线程指定为后台线程或前台线程。例如,通过将 Thread.IsBackground 设置为 true,就可以将线程指定为后台线程。同样,通过将 IsBackground 设置为 false,就可以将线程指定为前台线程。从非托管代码进入托管执行环境的所有线程都被标记为后台线程。通过创建并启动新的 Thread 对象而生成的所有线程都是前台线程。如果要创建希望用来侦听某些活动(如套接字连接)的前台线程,则应将 Thread.IsBackground 设置为 true,以便进程可以终止。
所以解决办法就是在主线程初始化的时候,设置:Thread.CurrentThread.IsBackground = true;

这样,主线程就是后台线程,在关闭主程序的时候就会关闭主线程,从而关闭所有线程。但是这样的话,就会强制关闭所有正在执行的线程,所以在关闭的时候要对线程工作的结果保存。

经常看到名为BeginXXX和EndXXX的方法,他们是做什么用的

这是.net的一个异步方法名称规范
.Net在设计的时候为异步编程设计了一个异步编程模型(APM),这个模型不仅是使用.NET的开发 人员使用,.Net内部也频繁用到,比如所有的Stream就有 BeginRead,EndRead,Socket,WebRequet,SqlCommand都运用到了这个模式,一般来讲,调用BegionXXX的 时候,一般会启动一个异步过程去执行一个操作,EndEnvoke可以接收这个异步操作的返回,当然如果异步操作在EndEnvoke调用的时候还没有执 行完成,EndInvoke会一直等待异步操作完成或者超时

.Net的异步编程模型(APM)一般包含BeginXXX,EndXXX,IAsyncResult这三个元素,BeginXXX方法都要返回一个IAsyncResult,而EndXXX都需要接收一个IAsyncResult作为参数,他们的函数签名模式如下

IAsyncResult BeginXXX(…);

<返回类型> EndXXX(IAsyncResult ar);

BeginXXX和EndXXX中的XXX,一般都对应一个同步的方法,比如FileStream的Read方法是一个同步方法,相应的 BeginRead(),EndRead()就是他的异步版本,HttpRequest有GetResponse来同步接收一个响应,也提供了 BeginGetResponse和EndGetResponse这个异步版本,而IAsynResult是二者联系的纽带,只有把BeginXXX所返 回的IAsyncResult传给对应的EndXXX,EndXXX才知道需要去接收哪个BeginXXX发起的异步操作的返回值。

这个模式在实际使用时稍显繁琐,虽然原则上我们可以随时调用EndInvoke来获得返回值,并且可以同步多个线程,但是大多数情况下当我们不需要 同步很多线程的时候使用回调是更好的选择,在这种情况下三个元素中的IAsynResult就显得多余,我们一不需要用其中的线程完结标志来判断线程是否 成功完成(回调的时候线程应该已经完成了),二不需要他来传递数据,因为数据可以写在任何变量里,并且回调时应该已经填充,所以可以看到微软在新 的.Net Framework中已经加强了对回调事件的支持,这总模型下,典型的回调程序应该这样写

a.DoWork+=new SomeEventHandler(Caculate);
a.CallBack+=new SomeEventHandler(callback);
a.Run();

(注:我上面讲的是普遍的用法,然而BeginXXX,EndXXX仅仅是一种模式,而对这个模式的实现完全取决于使用他的开发人员,具体实现的时 候你可以使用另外一个线程来实现异步,也可能使用硬件的支持来实现异步,甚至可能根本和异步没有关系(尽管几乎没有人会这样做)—–比如直接在 Beginxxx里直接输出一个”Helloworld”,如果是这种极端的情况,那么上面说的一切都是废话,所以上面的探讨并不涉及内部实现,只是告诉 大家微软的模式,和框架中对这个模式的经典实现)

 

 

异步和多线程有什么关联

有一句话总结的很好:多线程是实现异步的一种手段和工具

我们通常把多线程和异步等同起来,实际是一种误解,在实际实现的时候,异步有许多种实现方法,我们可以用进程来做异步,或者使用纤程,或者硬件的一些特性,比如在实现异步IO的时候,可以有下面两个方案:

1)可以通过初始化一个子线程,然后在子线程里进行IO,而让主线程顺利往下执行,当子线程执行完毕就回调

2)也可以根本不使用新线程,而使用硬件的支持(现在许多硬件都有自己的处理器),来实现完全的异步,这是我们只需要将IO请求告知硬件驱动程序,然后迅速返回,然后等着硬件IO就绪通知我们就可以了

实际上DotNet Framework里面就有这样的例子,当我们使用文件流的时候,如果制定文件流属性为同步,则使用BeginRead进行读取时,就是用一个子线程来调 用同步的Read方法,而如果指定其为异步,则同样操作时就使用了需要硬件和操作系统支持的所谓IOCP的机制

 

WinForm多线程编程篇

 

 

我的多线程WinForm程序老是抛出InvalidOperationException ,怎么解决?

在WinForm中使用多线程时,常常遇到一个问题,当在子线程(非UI线程)中修改一个控件的值:比如修改进度条进度,时会抛出如下错误

Cross-thread operation not valid: Control ‘XXX’ accessed from a thread other than the thread it was created on.

在VS2005或者更高版本中,只要不是在控件的创建线程(一般就是指UI主线程)上访问控件的属性就会抛出这个错误,解决方法就是利用控件提供的 Invoke和BeginInvoke把调用封送回UI线程,也就是让控件属性修改在UI线程上执行,下面列出会报错的代码和他的修改版本

 

ThreadStart threadStart=new ThreadStart(Calculate);//通过ThreadStart委托告诉子线程讲执行什么方法
Thread thread=new Thread(threadStart);
thread.Start();
public void Calculate(){
double Diameter=0.5;
double result=Diameter*Math.PI;
CalcFinished(result);//计算完成需要在一个文本框里显示
}
public void CalcFinished(double result){
this.TextBox1.Text=result.ToString();//会抛出错误
}

上面加粗的地方在debug的时候会报错,最直接的修改方法是修改Calculate这个方法如下

 

delegate void changeText(double result);public void Calculate(){
double Diameter=0.5;
double result=Diameter*Math.PI;
this.BeginInvoke(new changeText(CalcFinished),t.Result);//计算完成需要在一个文本框里显示
}

这样就ok了,但是最漂亮的方法是不去修改Calculate,而去修改CalcFinished这个方法,因为程序里调用这个方法的地方可能很多,由于加了是否需要封送的判断,这样修改还能提高非跨线程调用时的性能

 

delegate void changeText(double result);public void CalcFinished(double result){
if(this.InvokeRequired){
this.BeginInvoke(new changeText(CalcFinished),t.Result);
}
else{
this.TextBox1.Text=result.ToString();
}
}

上面的做法用到了Control的一个属性InvokeRequired(这个属性是可以在其他线程里访问的),这个属性表明调用是否来自另非UI线程,如果是,则使用BeginInvoke来调用这个函数,否则就直接调用,省去线程封送的过程

 

Invoke,BeginInvoke干什么用的,内部是怎么实现的?

这两个方法主要是让给出的方法在控件创建的线程上执行

Invoke使用了Win32API的SendMessage,

UnsafeNativeMethods.PostMessage(new HandleRef(this, this.Handle), threadCallbackMessage, IntPtr.Zero, IntPtr.Zero);

BeginInvoke使用了Win32API的PostMessage

UnsafeNativeMethods.PostMessage(new HandleRef(this, this.Handle), threadCallbackMessage, IntPtr.Zero, IntPtr.Zero);

这两个方法向UI线程的消息队列中放入一个消息,当UI线程处理这个消息时,就会在自己的上下文中执行传入的方法,换句话说凡是使用BeginInvoke和Invoke调用的线程都是在UI主线程中执行的,所以如果这些方法里涉及一些静态变量,不用考虑加锁的问题

 

每个线程都有消息队列吗?

不是,只有创建了窗体对象的线程才会有消息队列(下面给出<Windows 核心编程>关于这一段的描述)

当一个线程第一次 被建立时,系统假定线程不会被用于任何与用户相关的任务。这样可以减少线程对系统资源的要求。但是,一旦这个线程调用一个与图形用户界面有关的函数(例如 检查它的消息队列或建立一个窗口),系统就会为该线程分配一些另外的资源,以便它能够执行与用户界面有关的任务。特别是,系统分配一个T H R E A D I N F O结构,并将这个数据结构与线程联系起来。

这个T H R E A D I N F O结构包含一组成员变量,利用这组成员,线程可以认为它是在自己独占的环境中运行。T H R E A D I N F O是一个内部的、未公开的数据结构,用来指定线程的登记消息队列(posted-message queue)、发送消息队列( send-message queue)、应答消息队列( r e p l y -message queue)、虚拟输入队列(virtualized-input queue)、唤醒标志(wake flag)、以及用来描述线程局部输入状态的若干变量。图2 6 – 1描述了T H R E A D I N F O结构和与之相联系的三个线程。



为什么Winform不允许跨线程修改UI线程控件的值

在vs2003下,使用子线程调用ui线程创建的控件的属性是不会有问题的,但是编译的时候会出现警告,但是vs2005及以上版本就会有这样的问题,下面是msdn上的描述

“当您在 Visual Studio 调试器中运行代码时,如果您从一个线程访问某个 UI 元素,而该线程不是创建该 UI 元素时所在的线程,则会引发 InvalidOperationException。调试器引发该异常以警告您存在危险的编程操作。UI 元素不是线程安全的,所以只应在创建它们的线程上进行访问”

从上面可以看出,这个异常实际是debugger耍的花招,也就是说,如果你直接运行程序的exe文件,或者利用运行而不调试(Ctrl+F5)来 运行你的程序,是不会抛出这样的异常的.大概ms发现v2003的警告对广大开发者不起作用,所以用了一个比较狠一点的方法.

不过问题依然存在:既然这样设计的原因主要是因为控件的值非线程安全,那么DotNet framework中非线程安全的类千千万万,为什么偏偏跨线程修改Control的属性会有这样严格的限制策略呢?

这个问题我还回答不好,希望博友们能够予以补充

 

有没有什么办法可以简化WinForm多线程的开发

使用backgroundworker,使用这个组建可以避免回调时的Invoke和BeginInvoke,并且提供了许多丰富的方法和事件

参见.Net多线程总结(二)-BackgroundWorker,我在这里不再赘诉

 

线程池

 

线程池的作用是什么

作用是减小线程创建和销毁的开销

创建线程涉及用户模式和内核模式的切换,内存分配,dll通知等一系列过程,线程销毁的步骤也是开销很大的,所以如果应用程序使用了完一个线程,我们能把线程暂时存放起来,以备下次使用,就可以减小这些开销

所有进程使用一个共享的线程池,还是每个进程使用独立的线程池?

每个进程都有一个线程池,一个Process中只能有一个实例,它在各个应用程序域(AppDomain)是共享的,.Net2.0 中默认线程池的大小为工作线程25个,IO线程1000个,有一个比较普遍的误解是线程池中会有1000个线程等着你去取,其实不然, ThreadPool仅仅保留相当少的线程,保留的线程可以用SetMinThread这个方法来设置,当程序的某个地方需要创建一个线程来完成工作时, 而线程池中又没有空闲线程时,线程池就会负责创建这个线程,并且在调用完毕后,不会立刻销毁,而是把他放在池子里,预备下次使用,同时如果线程超过一定时 间没有被使用,线程池将会回收线程,所以线程池里存在的线程数实际是个动态的过程

为什么不要手动线程池设置最大值?

当我首次看到线程池的时候,脑袋里的第一个念头就是给他设定一个最大值,然而当我们查看ThreadPool的SetMaxThreads文档时往往会看到一条警告:不要手动更改线程池的大小,这是为什么呢?

其实无论FileStream的异步读写,异步发送接受Web请求,甚至使用delegate的beginInvoke都会默认调用 ThreadPool,也就是说不仅你的代码可能使用到线程池,框架内部也可能使用到,更改的后果影响就非常大,特别在iis中,一个应用程序池中的所有 WebApplication会共享一个线程池,对最大值的设定会带来很多意想不到的麻烦

线程池的线程为何要分类?

线程池有一个方法可以让我们看到线程池中可用的线程数量:GetAvaliableThread(out workerThreadCount,out iocompletedThreadCount),对于我来说,第一次看到这个函数的参数时十分困惑,因为我期望这个函数直接返回一个整形,表明还剩多少 线程,这个函数居然一次返回了两个变量.

原来线程池里的线程按照公用被分成了两大类:工作线程和IO线程,或者IO完成线程,前者用于执行普通的操作,后者专用于异步IO,比如文件和网络 请求,注意,分类并不说明两种线程本身有差别,线程就是线程,是一种执行单元,从本质上来讲都是一样的,线程池这样分类,举例来说,就好像某施工工地现在 有1000把铁锹,规定其中25把给后勤部门用,其他都给施工部门,施工部门需要大量使用铁锹来挖地基(例子土了点,不过说明问题还是有效的),后勤部门 用铁锹也就是铲铲雪,铲铲垃圾,给工人师傅修修临时住房,所以用量不大,显然两个部门的铁锹本身没有区别,但是这样的划分就为管理两个部门的铁锹提供了方 便

线程池中两种线程分别在什么情况下被使用,二者工作原理有什么不同?

下面这个例子直接说明了二者的区别,我们用一个流读出一个很大的文件(大一点操作的时间长,便于观察),然后用另一个输出流把所读出的文件的一部分写到磁盘上

我们用两种方法创建输出流,分别是

创建了一个异步的流(注意构造函数最后那个true)

FileStream outputfs=new FileStream(writepath, FileMode.Create, FileAccess.Write, FileShare.None,256,true);

创建了一个同步的流

FileStream outputfs = File.OpenWrite(writepath);

然后在写文件期间查看线程池的状况

string readpath = ”e://RHEL4-U4-i386-AS-disc1.iso”;
string writepath = ”e://kakakak.iso”;
byte[] buffer = new byte[90000000];//FileStream outputfs=new FileStream(writepath, FileMode.Create, FileAccess.Write, FileShare.None,256,true);
//Console.WriteLine(“异步流”);
//创建了一个同步的流

FileStream outputfs = File.OpenWrite(writepath);
Console.WriteLine(“同步流”);

//然后在写文件期间查看线程池的状况

ShowThreadDetail(“初始状态”);

FileStream fs = File.OpenRead(readpath);

fs.BeginRead(buffer, 0, 90000000, delegate(IAsyncResult o)
{

outputfs.BeginWrite(buffer, 0, buffer.Length,

delegate(IAsyncResult o1)
{

Thread.Sleep(1000);

ShowThreadDetail(“BeginWrite的回调线程”);

}, null);

Thread.Sleep(500);//this is important cause without this, this Thread and the one used for BeginRead May seem to be same one
},

null);

Console.ReadLine();

public static void ShowThreadDetail(string caller)
{
int IO;
int Worker;
ThreadPool.GetAvailableThreads(out Worker, out IO);
Console.WriteLine(“Worker: {0}; IO: {1}”, Worker, IO);
}
输出结果
 异步流
 Worker: 500; IO: 1000
 Worker: 500; IO: 999
 同步流
 Worker: 500; IO: 1000
 Worker: 499; IO: 1000

这两个构造函数创建的流都可以使用BeginWrite来异步写数据,但是二者行为不同,当使用同步的流进行异步写时,通过回调的输出我们可以看到,他使用的是工作线程,而非IO线程,而异步流使用了IO线程而非工作线程

其实当没有制定异步属性的时候,.Net实现异步IO是用一个子线程调用fs的同步Write方法来实现的,这时这个子线程会一直阻塞直到调用完 成.这个子线程其实就是线程池的一个工作线程,所以我们可以看到,同步流的异步写回调中输出的工作线程数少了一,而使用异步流,在进行异步写时,采用了 IOCP方法,简单说来,就是当BeginWrite执行时,把信息传给硬件驱动程序,然后立即往下执行(注意这里没有额外的线程),而当硬件准备就绪, 就会通知线程池,使用一个IO线程来读取

.Net线程池有什么不足

没有提供方法控制加入线程池的线程:一旦加入线程池,我们没有办法挂起,终止这些线程,唯一可以做的就是等他自己执行

1)不能为线程设置优先级
2)一个Process中只能有一个实例,它在各个AppDomain是共享的。ThreadPool只提供了静态方法,不仅我们自己添加进去的WorkItem使用这个Pool,而且.net framework中那些BeginXXX、EndXXX之类的方法都会使用此Pool。
3)所支持的Callback不能有返回值。WaitCallback只能带一个object类型的参数,没有任何返回值。
4)不适合用在长期执行某任务的场合。我们常常需要做一个Service来提供不间断的服务(除非服务器down掉),但是使用ThreadPool并不合适。

下面是另外一个网友总结的什么不需要使用线程池,我觉得挺好,引用下来
如果您需要使一个任务具有特定的优先级。
如果您具有可能会长时间运行(并因此阻塞其他任务)的任务。
如果您需要将线程放置到单线程单元中(所有 ThreadPool 线程均处于多线程单元中)。
如果您需要与该线程关联的稳定标识。例如,您应使用一个专用线程来中止该线程、将其挂起或按名称发现它。

 

锁定与同步

CLR怎样实现lock(obj)锁定?

从原理上讲,lock和Syncronized Attribute都是用Moniter.Enter实现的,比如如下代码

object lockobj=new object();
lock(obj){
//do things 
}

在编译时,会被编译为类似

try{
Moniter.Enter(obj){
//do things
}
}
catch{}
finally{
Moniter.Exit(obj);
}

[MethodImpl(MethodImplOptions.Synchronized)]标记为同步的方法会在编译时被lock(this)语句所环绕
所以我们只简单探讨Moniter.Enter的实现

(注:DotNet并非使用Win32API的CriticalSection来实现Moniter.Enter,不过他为托管对象提供了一个类似的结构叫做Syncblk)

每个对象实例头部都有一个指针,这个指针指向的结构,包含了对象的锁定信息,当第一次使用Moniter.Enter(obj)时,这个obj对象 的锁定结构就会被初时化,第二次调用Moniter.Enter时,会检验这个object的锁定结构,如果锁没有被释放,则调用会阻塞

 

WaitHandle是什么,他和他的派生类怎么使用

WaitHandle是Mutex,Semaphore,EventWaitHandler,AutoResetEvent,ManualResetEvent共同的祖先,他们包装了用于同步的内核对象,也就是说是这些内核对象的托管版本。

Mutex:类似于一个接力棒,拿到接力棒的线程才可以开始跑,当然接力棒一次只属于一个线程(Thread Affinity),如果这个线程不释放接力棒(Mutex.ReleaseMutex),那么没办法,其他所有需要接力棒运行的线程都知道能等着看热闹

Semaphore:类似于一个小桶,里面装了几个小球,凡是拿到小球就可以跑,比如指定小桶里最初有四个小球,那么开始的四个线程就可以直接拿着 自己的小球开跑,但是第五个线程一看,小球被拿光了,就只好乖乖的等着有谁放一个小球到小桶里(Semophore.Release),他才能跑,但是这 里的游戏规则比较特殊,我们可以随意向小桶里放入小球,也就是说我可以拿走一个小球,放回去俩,甚至一个都不拿,放回去5个,这样就有五个线程可以拿着这 些小球运行了.我们可以规定小桶里有开始有几个小球(构造函数的第一个参数),也可以规定最多不能超过多少小球(构造函数的第二个参数)

 

 

什么是用双锁实现Singleton,为什么要这样做,双锁检验是不安全的吗?

使用双锁检验技巧来实现单件,来自于Java社区

public static MySingleton Instance{
get{
if(_instance!=null)}{
lock(_instance){
if(s_value==null){
_instance= new MySingleton();
}
}
}
}
}

 

这样做其实是为了提高效率,比起

public static MySingleton Instance{

get{

lock(_instance){

if(s_value==null){

_instance= new MySingleton();

}

}

前一种方法在instance创建的时候不需要用lock同步,从而增进了效率

在java中这种技巧被证明是不安全的详细见http://www.cs.umd.edu/~pugh/java/memoryModel/

但是在.Net下,这样的技巧是成立的,因为.Net使用了改进的内存模型

并且在.Net下,我们可以使用LazyInit来实现单件

private static readonly _instance=new MySingleton()

public static MySingleton Instance{

get{return _instance}

}

当第一此使用_instance时,CLR会生成这个对象,以后再访问这个字段,将会直接返回

互斥对象(Mutex),信号量(Semaphore),事件(Event)对象与lock语句的比较

首先这里所谓的事件对象不是System.Event,而是一种用于同步的内核机制

互斥对象和事件对象属于内核对象,利用内核对象进行线程同步,线程必须要在用户模式和内核模式间切换,所以一般效率很低,但利用互斥对象和事件对象这样的内核对象,可以在多个进程中的各个线程间进行同步。

lock或者Moniter是.net用一个特殊结构实现的,不涉及模式切换,也就是说工作在用户方式下,同步速度较快,但是不能跨进程同步

 

什么时候需要锁定?

刚刚接触锁定的程序员往往觉得这个世界非常的危险,每个静态变量似乎都有可能产生竞争

首先锁定是解决竞争条件的,也就是多个线程同时访问某个资源,造成意想不到的结果,比如,最简单的情况,一个计数器,如果两个线程同时加一,后果就是损失了一个计数,但是频繁的锁定又可能带来性能上的消耗,还有最可怕的情况,死锁

到底什么情况下我们需要使用锁,什么情况下不用呢?

只有共享资源才需要锁定
首先,只有可以被多线程访问的共享资源才需要考虑锁定,比如静态变量,再比如某些缓存中的值,属于线程内部的变量不需要锁定

把锁定交给数据库
数据库除了存储数据之外,还有一个重要的用途就是同步,数据库本身用了一套复杂的机制来保证数据的可靠和一致性,这就为我们节省了很多的精力.保证了数据源头上的同步,我们多数的精力就可以集中在缓存等其他一些资源的同步访问上了

了解你的程序是怎么运行的
实 际上在web开发中大多数逻辑都是在单个线程中展开的,无论asp.net还是php,一个请求都会在一个单独的线程中处理,其中的大部分变量都是属于这 个线程的,根本没有必要考虑锁定,当然对于asp.net中的application对象中的数据,我们就要小心一些了

WinForm中凡是使用BeginInvoke和Invoke调用的方法也都不需要考虑同步,因为这用这两个方法调用的方法会在UI线程中执行,因此实际是同步的,所以如果调用的方法中存在某些静态变量,不需要考虑锁定

业务逻辑对事务和线程安全的要求
这 条是最根本的东西,开发完全线程安全的程序是件很费时费力的事情,在电子商务等涉及金融系统的案例中,许多逻辑都必须严格的线程安全,所以我们不得不牺牲 一些性能,和很多的开发时间来做这方面的工作,而一般的应用中,许多情况下虽然程序有竞争的危险,我们还是可以不使用锁定,比如有的时候计数器少一多一, 对结果无伤大雅的情况下,我们就可以不用去管他

计算一下冲突的可能性
我 以前曾经谈到过,架构不要过设计,其实在这里也一样,假如你的全局缓存里的某个值每天只有几百或者几千个访问,并且访问时间很短,并且分布均匀(实际上这 是大多数的情况),那么冲突的可能性就非常的少,也许每500天才会出现一次或者更长,从7*24小时安全服务的角度来看,也完全符合要求,那么你还会为 这样万分之一的可能性花80%的精力去设计吗?

请多使用lock,少用Mutex
如 果你一定要使用锁定,请尽量不要使用内核模块的锁定机制,比如.net的 Mutex,Semaphore,AutoResetEvent,ManuResetEvent,使用这样的机制涉及到了系统在用户模式和内核模式间的切 换,所以性能差很多,但是他们的优点是可以跨进程同步线程,所以应该清楚的了解到他们的不同和适用范围

 

 

Web和IIS

应用程序池,WebApplication,和线程池之间有什么关系

一个应用程序池是一个独立的进程,拥有一个线程池,应用程序池中可以有多个WebApplication,每个运行在一个单独的AppDomain中,这些WebApplication公用一个线程池

不同的AppDomain保证了每个WebApplication的静态变量不会互相干扰,不同的应用程序池保证了一个网站瘫痪,其他不同进程中的站点还能正常运行

下图说明了他们的关系

 

Web页面怎么调用异步WebService

把Page的Async属性设置为true,就可以调用异步的方法,但是这样调用的效果可能并不如我们的相像,请参考Web中使用多线程来增强用户体验

,

WinForm中的WebBrowser与web里面的html以及javascript的交互

归类于C# 参与评论

WinForm中的WebBrowser与web里面的html以及javascript的交互

Browser这个ActiveX控件了。这个类如果仅仅作为一个和IE一模一样浏览器,那就太没意思了(还不如直接用IE呢)。那么,无论我们是想做一个“定制版IE”,还是希望利用HTML来做用户界面(指WinApp而非WebApp。许多单机软件,包括Windows的帮助支持中心,都是HTML做的),都少不了Windows Form和包含在WebBrowser中的Web页面的交互。本文将通过几个实际的例子,初步介绍一下WinForm和WebBrowser所包含的Web页面之间的交互。

 

下面的代码假设你已经建立了一个Windows Form,上面有一个WebBrowser名为“webBrowser”。

Study Case 1:用WinForm的Event Handler响应Web页面的事件

现在有这样一个Windows Application,它的界面上只有一个WebBrowser,显示一个本地的HTML文件作为界面。现在的问题是,所有逻辑都可以放在HTML文件里,唯独“关闭”按钮遇到了困难——通常,Web页面是没有办法直接控制浏览器的,更不用说结束这个WinForm程序了。

但是,在.Net 2.0当中,“由Windows Form响应Web页面的事件”已经成为了现实。

在.Net 2.0中,整个HTML文档以及其包含的各个HTML元素,都和一个个HtmlDocument、HtmlElement之类的.Net对象对应。因此只要找到这个“关闭”按钮对应的HtmlElement对象,为其click事件添加Event Handler即可。

假设HTML源代码如下:

<html>
<body>
<input type=”button” id=”btnClose” value=”关闭” />
</body>
</html>
那么找出该按钮并为之添加Event Handler的代码如下:
HtmlDocument htmlDoc = webBrowser.Document;
HtmlElement btnElement = htmlDoc.All["btnClose"];
if (btnElement != null)
{
   btnElement.click += new HtmlElementEventHandler(HtmlBtnClose_Click);
}

其中HtmlBtnClose_Click是按下Web按钮时的Event Handler。

很简单吧?那么稍稍高级一点的——我们都知道一个HTML元素可能有很多各种各样的事件,而HtmlElement这个类只给出最常用、共通的几个。那么,如何响应其他事件呢?这也很简单,只需要调用HtmlElement的AttachEventHandler就可以了:

btnElement.AttachEventHandler(“onclick”, new EventHandler(HtmlBtnClose_Click)); 
//这一句等价于上面的btnElement.click += new HtmlElementEventHandler(HtmlBtnClose_Click); 
对于其他事件,把”onclick”换成该事件的名字就可以了。例如:

formElement.AttachEventHandler(“onsubmit”, new EventHandler(HtmlForm_Submit)); 

Study Case 2:表单(form)的自动填写和提交

要使我们的WebBrowser具有自动填表、甚至自动提交的功能,并不困难。

假设有一个最简单的登录页面,输入用户名密码,点“登录”按钮即可登录。已知用户名输入框的id(或Name,下同)是username,密码输入框的id是password,“登录”按钮的id是submitbutton,那么我们只需要在webBrowser的DocumentCompleted事件中使用下面的代码即可:

HtmlElement btnSubmit = webBrowser.Document.All["submitbutton"];
HtmlElement tbUserid = webBrowser.Document.All["username"];
HtmlElement tbPasswd = webBrowser.Document.All["password"];

if (tbUserid == null || tbPasswd == null || btnSubmit == null)
   return;

tbUserid.SetAttribute(“value”, “smalldust”);
tbPasswd.SetAttribute(“value”, “12345678″);

btnSubmit.InvokeMember(“click”);
这里我们用SetAttribute来设置文本框的“value”属性,用InvokeMember来调用了按钮的“click”方法。因为不同的Html元素,其拥有的属性和方法也不尽相同,所以.Net 2.0提供了统一的HtmlElement来概括各种Html元素的同时,提供了这两个方法以调用元素特有的功能。关于各种Html元素的属性和方法一览,可以查阅MSDN的DHTML Reference。

※关于表单的提交,的确还有另一种方法就是获取form元素而不是button,并用form元素的submit方法:

HtmlElement formLogin = webBrowser.Document.Forms["loginForm"]; 
//…… 
formLogin.InvokeMember(“submit”); 
本文之所以没有推荐这种方法,是因为现在的网页,很多都在submit按钮上添加onclick事件,以对提交的内容做最基本的验证。如果直接使用form的submit方法,这些验证代码就得不到执行,有可能会引起错误。
Study Case 3:查找并选择文本

这次我们希望实现一个和IE一模一样的查找功能,以对Web页面内的文字进行查找。

文本查找要借助于TextRange对象的findText方法。但是,.Net里并没有这个对象。这是因为,.Net 2.0提供的HtmlDocument,HtmlWindow,HtmlElement等类,只不过是对原有mshtml这个COM组件的不完整封装,只提供了mshtml的部分功能。所以许多时候,我们仍旧要借助mshtml来实现我们需要的功能。好在这些.Net类都提供了DomDocument这个属性,使得我们很容易把.Net对象转换为COM对象使用。下面的代码演示了如何查找Web页面的文本。
(需要添加mshtml的引用,并加上using mshtml;)

   public partial class SearchDemo : Form
   {
       // 建立一个查找用的TextRange(IHTMLTxtRange接口)
       private IHTMLTxtRange searchRange = null;
       public SearchDemo()
       {
           InitializeComponent();
       }

       private void btnSearch_Click(object sender, EventArgs e)
       {
           // Document的DomDocument属性,就是该对象内部的COM对象。
           IHTMLDocument2 document = (IHTMLDocument2)webBrowser.Document.DomDocument;
           string keyword = txtKeyword.Text.Trim();
           if (keyword == “”)
               return;

           // IE的查找逻辑就是,如果有选区,就从当前选区开头+1字符处开始查找;没有的话就从页面最初开始查找。
           // 这个逻辑其实是有点不大恰当的,我们这里不用管,和IE一致即可。
           if (document.selection.type.ToLower() != “none”)
           {
               searchRange = (IHTMLTxtRange)document.selection.createRange();
               searchRange.collapse(true);
               searchRange.moveStart(“character”, 1);
           }
           else
           {
               IHTMLBodyElement body = (IHTMLBodyElement)document.body;
               searchRange = (IHTMLTxtRange)body.createTextRange();
           }

           // 如果找到了,就选取(高亮显示)该关键字;否则弹出消息。
           if (searchRange.findText(keyword, 1, 0))
           {
               searchRange.select();
           }
           else
           {
               MessageBox.Show(“已搜索到文档结尾。”);
           }
       }
   }
到此为止,简单的查找就搞定了。至于替换功能,看了下一个例子,我相信你就可以触类旁通轻松搞定了。

Study Case 4:高亮显示

上一个例子中我们学会了查找文本——究跟到底,对Web页面还是只读不写。那么,如果说要把所有的搜索结果高亮显示呢?我们很快会想到把所有匹配的文字颜色、背景改一下就可以了。

首先想到的可能是直接修改HTML文本吧……但是,与SourceCode的高亮显示不同,我们需要并且只需要高亮页面中的文本部分。HTML标签、脚本代码等等是绝对不应该去改动的。因此我们不能把整个页面的Source Code读进来然后replace,那样有破坏HTML文件结构的可能;我们只能在能够分离出文本与其他内容(标签,脚本……)的前提下进行。

具体方法有很多,下面提供两个比较简单的方法。
方法一:使用TextRange(IHTMLTxtRange)
有了上一个Case的基础,相信大家立刻会想到使用TextRange。没错,TextRange除了提供查找方法之外,还提供了一个pasteHTML方法,以指定的HTML文本替换当前TextRange中的内容。代码片断如下:

   public partial class HilightDemo : Form
   {
       // 定义高亮显示效果的标签。
       string tagBefore = “<span style=’background-color:yellow;color:black’>”;
       string tagAfter = “</span>”;

       // ……

       private void btnHilight_Click(object sender, EventArgs e)
       {
           HtmlDocument htmlDoc = webBrowser.Document;
           string keyword = txtKeyword.Text.Trim();
           if (keyword == “”)
               return;

           object oTextRange = htmlDoc.Body.InvokeMember(“createTextRange”);

           mshtml.IHTMLTxtRange txtrange = oTextRange as mshtml.IHTMLTxtRange;

           while (txtrange.findText(keyword, 1, 4))
           {
               try
               {
                   txtrange.pasteHTML(tagBefore + keyword + tagAfter);
               }
               catch { }
               txtrange.collapse(false);
           }
       }
   }

※这段代码里获取IHTMLTxtRange的方式和上面的例子稍稍不同,其实所谓条条大路通罗马,本质是一样的。

方法二:使用DOM(文档对象模型)
将HTML文档解析为DOM,然后遍历每个节点,在其中搜索关键字并进行相应替换处理即可。

   public partial class HilightDemo : Form
   {
       //……

       private void btnHilight_Click(object sender, EventArgs e)
       {
           HTMLDocument document = (HTMLDocument)webBrowser.Document.DomDocument;
           IHTMLDOMNode bodyNode = (IHTMLDOMNode)webBrowser.Document.Body.DomElement;
           string keyword = txtKeyword.Text.Trim();
           if (keyword == “”)
               return;

           HilightText(document, bodyNode, keyword);
       }

       private void HilightText(HTMLDocument document, IHTMLDOMNode node, string keyword)
       {
           // nodeType = 3:text节点
           if (node.nodeType == 3)
           {
               string nodeText = node.nodeValue.ToString();
               // 如果找到了关键字
               if (nodeText.Contains(keyword))
               {
                   IHTMLDOMNode parentNode = node.parentNode;
                   // 将关键字作为分隔符,将文本分离,并逐个添加到原text节点的父节点
                   string[] result = nodeText.Split(new string[] { keyword }, StringSplitOptions.None);
                   for (int i = 0; i < result.Length – 1; i++)
                   {
                       if (result[i] != “”)
                       {
                           IHTMLDOMNode txtNode = document.createTextNode(result[i]);
                           parentNode.insertBefore(txtNode, node);
                       }
                       IHTMLDOMNode orgNode = document.createTextNode(keyword);
                       IHTMLDOMNode hilightedNode = (IHTMLDOMNode)document.createElement_x(“SPAN”);
                       IHTMLStyle style = ((IHTMLElement)hilightedNode).style;
                       style.color = “black”;
                       style.backgroundColor = “yellow”;
                       hilightedNode.appendChild(orgNode);

                       parentNode.insertBefore(hilightedNode, node);
                   }
                   if (result[result.Length - 1] != “”)
                   {
                           IHTMLDOMNode postNode = document.createTextNode(result[result.Length - 1]);
                           parentNode.insertBefore(postNode, node);
                   }
                   parentNode.removeChild(node);
               } // End of nodeText.Contains(keyword)
           }
           else
           {
               // 如果不是text节点,则递归搜索其子节点
               IHTMLDOMChildrenCollection childNodes = node.childNodes as IHTMLDOMChildrenCollection;
               foreach (IHTMLDOMNode n in childNodes)
               {
                   HilightText(document, n, keyword);
               }
           }
       }
   }

上面的两段代码都是为了清晰易懂而精简得不能再简的,有很多地方很不完善。比如,没考虑到如何从高亮显示状态复原;也没有大小写匹配等等。当然,掌握了原理之后相信这些都不会太难。

这两种方法各有优缺点:
使用TextRange较轻量迅速,而且有一个特长,就是可以把跨标签(Tag)的关键字挑出来。例如,有这么一段HTML:

<b>Hel</b>lo World!
先不管作者出于什么目的让Hel三个字母成为粗体,总之显示在页面上的是一句“Hello World!”。在我们希望高亮页面中的“Hello”这个关键字时,如果用DOM分析的话,会得出含有“Hel”的<b>节点和文本节点“lo World!”两个节点,因此无法将其挑出来。而TextRange则能正确识别,将其设置为高亮。因此也可以说TextRange是只和文本有关,和HTML语法结构无关的对象。

但是,TextRange也有其致命缺点,加亮容易,反向的话就很难。换句话说,去除高亮显示的时候不能再用TextRange,而需要采用其他方法。

而DOM方法则正好相反, 由于DOM的树状结构特性,虽然不能(或者很难)跨越Tag搜索关键字,但是去除高亮显示并不繁琐。

Study Case 5:与脚本的互操作

在Case 1当中,我们已经看到,Web页面的HTML元素的事件,可以由Windows Form端来响应,可以在某种程度上看作是Web页面调用WinForm;那么反过来,WinForm除了可以直接访问Web页面的HTML元素之外,能否调用Web页面里的各种Script呢?

首先是调用Web页面的脚本中已经定义好的函数。假设HTML中有如下Javascript:

function DoAdd(a, b) {
   return a + b;
}
那么,我们要在WinForm调用它,只需如下代码即可:

object oSum = webBrowser.Document.InvokeScript(“DoAdd”, new object[] { 1, 2 });
int sum = Convert.ToInt32(oSum);
其次,如果我们想执行一段Web页面中原本没有的脚本,该怎么做呢?这次.Net的类没有提供,看来还要依靠COM了。IHTMLWindow2可以将任意的字符串作为脚本代码来执行。

string scriptline01 = @”function ShowPageInfo() {“;
string scriptline02 = @”     var numLinks = document.links.length; “;
string scriptline03 = @”     var numForms = document.forms.length; “;
string scriptline04 = @”     var numImages = document.images.length; “;
string scriptline05 = @”     var numScripts = document.scripts.length; “;
string scriptline06 = @”     alert(‘网页的统计结果:\r\n链接数:’ + numLinks + “;
string scriptline07 = @”        ‘\r\n表单数:’ + numForms + “;
string scriptline08 = @”        ‘\r\n图像数:’ + numImages + “;
string scriptline09 = @”        ‘\r\n脚本数:’ + numScripts);}”;
string scriptline10 = @”ShowPageInfo();”;

string strScript = scriptline01 + scriptline02 + scriptline03 + scriptline04 + scriptline05 +
                  scriptline06 + scriptline07 + scriptline08 + scriptline09 + scriptline10;

IHTMLWindow2 win = (IHTMLWindow2)webBrowser.Document.Window.DomWindow;
win.execScript(strScript, “Javascript”);

 

,

C#异常处理机制运用与介绍

归类于C# 参与评论

C#异常处理机制运用与介绍

C#异常处理机制需要注意的几点:

1.不管你写作如何严谨Application.ThreadException事件一定要实现。

2.在界面层,如Button_Click事件内的代码如何简单一定要用try..catch..保护。

3.不管方法/函数嵌套多少层,至少在最外层一定要try..catch..保护。

4.显示异常消息时少用红色X图标,因为客户看到红X以为系统要崩溃了!

5.不需要每层内每个方法用try..catch..保护,只确定最外层保护起来就行了(个别情况除外)。

好了,转入正题,下面简要介绍下C#异常机制:

一、C#的异常处理所用到关键字

     try 用于检查发生的异常,并帮助发送任何可能的异常。

     catch 以控制权更大的方式处理错误,可以有多个catch子句。

     finally 无论是否引发了异常,finally的代码块都将被执行。

     throw 用于引发异常,可引发预定义异常和自定义异常。

二、C#异常处理的格式

try
{
 程序代码块;
}
catch(Exception e)
{
   异常处理代码块;
}
finally
{
   无论是否发生异常,均要执行的代码块;
}

三、异常处理实战

    一个除数和零的简单例子:
public class DivisorIsZero
{
private static void Main()
{
int dividend=10;
int divisor1=0;
int divisor2=5;
int DivideValue;
try
{
DivideValue=dividend/divisor1; //(1)
//DivideValue=dividend/divisor2; //(2)
System.Console.WriteLine("DivideValue={0}",DivideValue);//(3)这一行将不会被执行。
}
catch
{
System.Console.WriteLine("传递过来的异常值为:{0}",e);
}
finally
{
System.Console.WriteLine("无论是否发生异常,我都会显示。");
}
}
}

注:(1)行被执行则会抛出一个异常,如果没有catch语句,程序会异常终止,使用不带参数的catch子句,
则可以捕获任意类型的异常。
如果将(1)行注释掉,启用(2)行,这意味该程序运行时不会出现异常,
从输出可知,finally代码块仍将被执行。

可以给try语句提供多个catch语句,以捕获特定的异常,
如上例中:0作为除数则会引发DivideByZeroException类型的异常,上例中的catch语句可以作如下修改:
catch(DivideByZeroException e)
{
    System.Console.WriteLine("零不能作为除数!异常值为:"n{0}",e);
}
catch(Exception e)
{
    System.Console.WriteLine("并非"''零作为除数引发的异常""!异常值为:"n{0}",e);
}
为什么还要加上一个catch(Exception e)子句呢?
原因很简单,catch(DivideByZeroException e)子句只能捕获特定的异常,
try内的程序代码可能还会产生其它的异常,这些异常只能由catch(Exception e)来捕获了。
下表给出了一些常见的异常:
System名称空间中常用的异常类

异常类名称                                          简单描述

MemberAccessException                               访问错误:类型成员不能被访问
ArgumentException                                   参数错误:方法的参数无效
ArgumentNullException                               参数为空:给方法传递一个不可接受的空参数
ArithmeticException                                 数学计算错误:由于数学运算导致的异常,覆盖面广
ArrayTypeMismatchException                          数组类型不匹配
DivideByZeroException                               被零除
FormatException                                     参数的格式不正确
IndexOutOfRangeException                            索引超出范围,小于0或比最后一个元素的索引还大
InvalidCastException                                非法强制转换,在显式转换失败时引发
MulticastNotSupportedException                      不支持的组播:组合两个非空委派失败时引发
NotSupportedException                               调用的方法在类中没有实现
NullReferenceException                              引用空引用对象时引发
OutOfMemoryException                                无法为新语句分配内存时引发,内存不足
OverflowException                                   溢出
StackOverflowException                              栈溢出
TypeInitializationException                         错误的初始化类型:静态构造函数有问题时引发
NotFiniteNumberException                            无限大的值:数字不合法

四、定义自己的异常类

除了预定义的异常外,我们还可以创建自己的异常,过程比较简单:

㈠声明一个异常,格式如下:

class ExceptionName:Exception{}

㈡引发自己的异常:

throw(ExceptionName);

看一个例子:
class IAmSecondGrade:System.Exception{}//声明异常
class SecondGrade
{
//运行这个事件,用来引发并抛出异常
public static int mul(int first,int second)
{
  if(first>100||second>100)
  throw new IAmSecondGrade();//引发异常
  return (first*second);
}
public static void Main()
{
  int mul_value;
  try
  {
  mul_value=mul(99,56);
  System.Console.WriteLine("99与56积为:{0}",mul_value);
  //执行开始的函数,会获得异常
  mul_value=mul(101,4);
  System.Console.WriteLine("出现异常,这行是不会被执行的。");
}
catch(IAmSecondGrade)//捕获自定义的异常
{
  System.Console.WriteLine("我才上二年级,超过100的乘法我不会。嘿嘿,我自定义的异常。");
}
catch(System.Exception e)
{
  System.Console.WriteLine("非自定义异常。其值为:{0}",e);
}
}
}

.NET,好吧,你让我蛋疼了

归类于C# 一条评论

搞惯了JAVA,搞起.NET来总是感觉别扭,遇到问题总感觉很是蛋疼,找来找去难以找到原因。网上的资料又少。根据IDE的提示去找问题所在么老是木有反应,问题依旧。提示framework版本不对吧

好吧,我换到你提示的版本,擦擦你个大西瓜,还是不对。好了我再装上高点的版本么,NND无语错误提示依旧是那个。

一开始我的版本是4.0,好吧你提示2.0,我再装个。妈的还是不行。高版本不兼容低版本的程序?我日了个去。

本以为复制粘贴过来的东西稍微改改就OK了。

没想到折腾了好几晚,运行都没运行起来,操蛋啊

提示信息1如下

错误 23 未找到 .NET Framework v3.5 Service Pack 1。若要以“.NETFramework,Version=v2.0”为目标,必须安装 .NET Framework v3.5 Service Pack 1 或更高版本。
好吧,我再去下个3.5的装装试试。顶你个肺。

DevExpress打印详解 DEV 打印控件<转>

归类于C# 参与评论

因工作需要,要求将Developer Express .NET v7.2中的ChartControl进行直接打印,通过几天的学习,终于对打印有了初步的认识,并实现了打印功能,下面介绍下如何使用DevExpress下的打印功能:
首先要实现打印功能必须添加一个引用:DevExpress.XtraPrint.v7.2
实现打印需要用到的主要的类:

1. public class PrintingSystem : Component, ISupportInitialize,IPrintingSystem,IAccessible,IExporter,IPrintingSystemContext
该类负责提供生成报表的一些方法,还提供了对页面进行设置和打印报表的一些函数,这个类的属性包含了访问其他管理报表的对象,如Document类,BrickGraphics类(在报表上进行画图的类),

XtraPageSettings类(提供对打印页面进行设置的操作)
2. public class PrintableComponentLink : Link
该类的功能是对实现DevExpress.XtraPrinting.IPrintable接口的所有控件进行打印,它提供了一些基本的生成和打印报表的功能。在生成报表以后可以通过PrintingSystem将报表打印出来

通过以上这两个类就能完全实现各种控件的打印了,只要一个控件实现了DevExpress.XtraPrinting.IPrintable这个接口就能够对该控件进行打印,如GridControl,CharControl等等,下面给出具体的实

现方法:

public class PrintSettingController
{
PrintingSystem ps = null;
string formName = null;

PrintableComponentLink link = null;

string _PrintHeader = null;
/// <summary>
/// 打印时的标题
/// </summary>
public string PrintHeader
{
set
{
_PrintHeader = value;
}
}

string _PrintFooter = null;
/// <summary>
/// 打印时页脚
/// </summary>
public string PrintFooter
{
set
{
_PrintFooter = value;
}
}

bool _landScape;
/// <summary>
/// 页面横纵向
/// </summary>
public bool LandScape
{
set { _landScape = value; }
}

System.Drawing.Printing.PaperKind _paperKind;
/// <summary>
/// 纸型
/// </summary>
public System.Drawing.Printing.PaperKind PaperKind
{
set { _paperKind = value; }
}

/// <summary>
/// 打印控制器
/// </summary>
/// <param name=”control”>要打印的部件</param>
public PrintSettingController(IPrintable control)
{
if (control == null) return;
Control c = (Control)control;
formName = c.FindForm().GetType().FullName + “.” + c.Name;
ps = new DevExpress.XtraPrinting.PrintingSystem();
link = new DevExpress.XtraPrinting.PrintableComponentLink(ps);
ps.Links.Add(link);
link.Component = control;
}

/// <summary>
/// 打印预览
/// </summary>
public void Preview()
{
try
{
if (DevExpress.XtraPrinting.PrintHelper.IsPrintingAvailable)
{
Cursor.Current = Cursors.AppStarting;
if (_PrintHeader != null)
{
PageHeaderFooter phf = link.PageHeaderFooter as PageHeaderFooter;

//设置页眉
phf.Header.Content.Clear();
phf.Header.Content.AddRange(new string[] { “”, _PrintHeader, “” });
phf.Header.Font = new System.Drawing.Font(“宋体”, 14, System.Drawing.FontStyle.Bold);
phf.Header.LineAlignment = BrickAlignment.Center;

//设置页脚
phf.Footer.Content.Clear();
phf.Footer.Content.AddRange(new string[] { “”, “”, _PrintFooter });
phf.Footer.Font = new System.Drawing.Font(“宋体”, 9, System.Drawing.FontStyle.Regular);
phf.Footer.LineAlignment = BrickAlignment.Center;

}
link.PaperKind = ps.PageSettings.PaperKind ;
link.Margins = ps.PageSettings.Margins;
link.Landscape = ps.PageSettings.Landscape;
link.CreateDocument();

//汉化
DevExpress.XtraPrinting.Localization.PreviewLocalizer.Active = new Dxperience.LocalizationCHS.DxperienceXtraPrintingLocalizationCHS();
ps.PreviewFormEx.Show();

}
else
{
Cursor.Current = Cursors.Default;
MessageBox.Show(“打印机不可用 “, “提示”, MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
finally
{
Cursor.Current = Cursors.Default;
}
}

/// <summary>
/// 打印
/// </summary>
public void Print()
{
try
{
if (DevExpress.XtraPrinting.PrintHelper.IsPrintingAvailable)
{
if (_PrintHeader != null)
{
PageHeaderFooter phf = link.PageHeaderFooter as PageHeaderFooter;

//设置页眉
phf.Header.Content.Clear();
phf.Header.Content.AddRange(new string[] { “”, _PrintHeader, “” });
phf.Header.Font = new System.Drawing.Font(“宋体”, 14, System.Drawing.FontStyle.Bold);
phf.Header.LineAlignment = BrickAlignment.Center;

//设置页脚
phf.Footer.Content.Clear();
phf.Footer.Content.AddRange(new string[] { “”, “”, _PrintFooter });
phf.Footer.Font = new System.Drawing.Font(“宋体”, 9, System.Drawing.FontStyle.Regular);
phf.Footer.LineAlignment = BrickAlignment.Center;

}
link.PaperKind = ps.PageSettings.PaperKind;
link.Margins = ps.PageSettings.Margins;
link.Landscape = ps.PageSettings.Landscape;
link.CreateDocument();
link.CreateDocument();
//汉化
DevExpress.XtraPrinting.Localization.PreviewLocalizer.Active = new Dxperience.LocalizationCHS.DxperienceXtraPrintingLocalizationCHS();
ps.Print();
}
else
{
Cursor.Current = Cursors.Default;
MessageBox.Show(“打印机不可用 “, “提示”, MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
finally
{
}
}

//获取页面设置信息
public void LoadPageSetting()
{

System.Drawing.Printing.Margins margins = new System.Drawing.Printing.Margins(60, 60, 60, 60);
ps.PageSettings.Assign(margins, _paperKind, _landScape);

}
}

客户端如何使用:实例化PrintSettingController,进行参数设置,包括页眉页脚横纵向纸型,当然所有这些设置信息也可以在PrintSettingControll类里进行设置了,我这里是需求的需要,所以加在了

外面,PrintSystem.PageSettings属性是XtraPageSettings类型,XtraPageSettings类封装了所有的页面设置信息,你可以在LoadPageSetting()函数里面进行修改,来实现自己想要的功能,例如可以把

设置信息保存成XML文件
PrintSettingController psc = new PrintSettingController(this.gridControl1);
//页眉
psc.PrintHeader = this.Text;

//页脚
psc.PrintFooter = this.dateTimePicker1.Text.ToString();

//横纵向
psc.LandScape = this.rbtnHorizon.Checked;

//纸型
psc.PaperKind = System.Drawing.Printing.PaperKind.A4;
//加载页面设置信息
psc.LoadPageSetting();

psc.Preview();
另外该类实现了对打印预览对话框的汉化功能,添加了一个引用DXChinese.dll,然后在程序中加入了以下代码即可实现汉化:
DevExpress.XtraPrinting.Localization.PreviewLocalizer.Active = new Dxperience.LocalizationCHS.DxperienceXtraPrintingLocalizationCHS();
这个dll在csdn上面有下载,这个汉化程序可以对很多对话框进行汉化,如果需要汉化功能,可以参考下,如果需要请发邮件wdwgr@163.com

继续努力,加油!

顶部