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

win2003下apache启动GZip压缩提高传输速度

归类于Apache 参与评论

win2003下apache启动GZip压缩提高传输速度

试验通过,速度大幅提高,给力的

#—————For GZip 20121128   start———————————————————
LoadModule headers_module modules/mod_headers.so #必须启用
LoadModule deflate_module modules/mod_deflate.so     #必须启用

<IfModule deflate_module>
DeflateCompressionLevel 3                                       #压缩参数1~9,数字越大,压缩比越高,越占服务器资源
AddOutputFilter DEFLATE html xml jsp js css #需要启用压缩的文件类型

SetOutputFilter DEFLATE

#Don’t compress 对于图片等文件不启用压缩操作
SetEnvIfNoCase Request_URI \\.(?:gif|jpe?g|png)$ no-gzip dont-vary
SetEnvIfNoCase Request_URI .(?:exe|t?gz|zip|bz2|sit|rar)$ no-gzip dont-vary
SetEnvIfNoCase Request_URI .(?:pdf|mov|avi|mp3|mp4|rm)$ no-gzip dont-vary

#Dealing  with proxy servers 针对代理的设置
<IfModule headers_module>
Header append vary User-Agent
</IfModule>

BrowserMatch ^Mozilla/4 gzip-only-text/html                # Netscape 4.x 有一些问题,所以只压缩文件类型是text/html的
BrowserMatch ^Mozilla/4.0[678] no-gzip                          # Netscape 4.06-4.08 有更多的问题,所以不开启压缩
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html    # IE浏览器会伪装成 Netscape ,但是事实上它没有问题
</IfModule>
#—————For GZip 20121128   end———————————————————

,

Java中的各大WebService:Java6、Axis2、XFire、CXF简要介绍和使用

归类于Java 参与评论

Java中的各大WebService:Java6、Axis2、XFire、CXF简要介绍和使用

首先说明下,对于以上这些开源的框架和JWS,我都用过了。

看了前面一系列Java6 JWS的文章,很显然,无论从开发还是部署角度来说,Java6的JWS都是最容易的。我们不禁回想:有了Java6,还需要Axis2、XFire、CXF吗?

要回答这个问题,需要对几种JWS的实现以及其他功能做个对比就搞明白了。

1、JWS是Java语言对WebService服务的一种实现,用来开发和发布服务。而从服务本身的角度来看JWS服务是没有语言界限的。但是Java语言为Java开发者提供便捷发布和调用WebService服务的一种途径。

2、Axis2是Apache下的一个重量级WebService框架,准确说它是一个Web Services / SOAP / WSDL 的引擎,是WebService框架的集大成者,它能不但能制作和发布WebService,而且可以生成Java和其他语言版WebService客户端和服务端代码。这是它的优势所在。但是,这也不可避免的导致了Axis2的复杂性,使用过的开发者都知道,它所依赖的包数量和大小都是很惊人的,打包部署发布都比较麻烦,不能很好的与现有应用整合为一体。但是如果你要开发Java之外别的语言客户端,Axis2提供的丰富工具将是你不二的选择。

3、XFire是一个高性能的WebService框架,在Java6之前,它的知名度甚至超过了Apache的Axis2,XFire的优点是开发方便,与现有的Web整合很好,可以融为一体,并且开发也很方便。但是对Java之外的语言,没有提供相关的代码工具。XFire后来被Apache收购了,原因是它太优秀了,收购后,随着Java6 JWS的兴起,开源的WebService引擎已经不再被看好,渐渐的都败落了。

4、CXF是Apache旗下一个重磅的SOA简易框架,它实现了ESB(企业服务总线)。CXF来自于XFire项目,经过改造后形成的,就像目前的Struts2来自WebWork一样。可以看出XFire的命运会和WebWork的命运一样,最终会淡出人们的视线。CXF不但是一个优秀的Web Services / SOAP / WSDL 引擎,也是一个不错的ESB总线,为SOA的实施提供了一种选择方案,当然他不是最好的,它仅仅实现了SOA架构的一部分。

基于以上的认识,我们可以得知,虽然有了Java6,但是我们还可以选择Axis2、XFire、CXF等。我们不能指望有了Java6 JWS,就能异想天开去实施SOA。如果要与别的语言交互,也许我们还有赖于Axis2等等,当然这不是唯一选择,仅仅是一种可供选择的方案。

还有,目前很多企业的应用还是基于Java5的,而Java5的项目不会瞬间都升级到Java6,如果要在老项目上做扩展,我们还有赖于其他开源的WS引擎。

因此,是否还需要Aixs2、XFire、CXF要看你具体的项目是否需要,而不能一概而论。

关于 java.lang.IllegaAccessError:Class ref in pre-verified class resoved to unexpected implementation

归类于Android 参与评论

初始Adroid 魔幻威力,遇此一难题,四处搜寻解决之道。

错误现象:在将程序安装到模拟器,并启动程序时直接报错。提示主程序严重异常。

原因:由于一开始没有直接指定BuildTarget的GoogleMapAPI,所以自己直接将map.jar复制到了lib下,导致环境中跟项目中都有map.jar,多出了,导致出错。

解决方法:删除lib下的map.jar,指定BuildTarget为GoogleMapAPI。

就此google 地图正常出现。爽哉!

———–一些详细示例———————:

http://www.cnblogs.com/zhangdongzi/archive/2012/01/09/2317632.html

http://hi.baidu.com/168dengruijun/item/6adab9bb6d687ba6eaba93cc

http://noobjava.iteye.com/blog/1004781

http://wenku.baidu.com/view/704d821ea76e58fafab003b0.html

http://wenku.baidu.com/view/1706d7ea6294dd88d0d26bd3.html

https://developers.google.com/maps/?hl=zh-CN

———–以下为一些参考——————-:

这2天在研究了一下Google map,遇到了一个错误

:java.lang.IllegaAccessError:Class ref in

pre-verified class resoved to unexpected

implementation

这个错误的意思是引进了没有必要的包。经过1的

纠结,我才发现我在建工程的时候Build Target

没有选择“Google APIs‘,所以在程序中用到

google map的类

的时候eclipse会提示我引进外面google map的包

,所以导致了这个 错误,fk,浪费了我一天的时

间。希望以后编程能够细心一点!

Android Google Map API 开发基础知识

归类于Android 参与评论

开发基于谷歌地图的应用和普通的android应用差不多都要使用它提供给我们的类库,所不同的是google map的类库不是android平台的基本类库,是google api的一部分,所以建立项目时,SDK要选择Google APIs;

还有一点,开发基于地图的应用时候需要使用google map的APIkey,必须先申请key,然后才能开发基于地图的应用。

下边分步骤记录下,整个过程:

 一、申请google Maps API key(用于开发和debug)

为了能顺利的申请Android Map API Key,必须要准备google的账号和系统的证明书。一般Google发布Key都需要Google账号,Google账号是通用的,Gmail的账号就可以。当一个程序发布时必须要证明书,证明书其实就是MD5.我们这里并不是发布,而只是为了开发测试,可以使用Debug版的证明书,下面我们就来学习如何申请Debug版的Key:

1.找到你的debug.keystore文件

在Eclipse工具下,选择windows–>Preference–>Android–>Build,其中Default debug keystore的值便是debug.keystore的路径了。

2.取得debug.keystore的MD5值

首先cmd命令行进入debug.keystore文件所在的路径,执行命令:keytool -list -keystore debug.keystore,这时可能会提示你输入密码,这里默认的密码是“android”,这样即可取得MD5值。

3.申请Android Map 的API Key.

打开浏览器,输入网址:http://code.google.com/android/maps-api-signup.html,填入你的认证指纹(MD5)即可获得apiKey了,结果显示如下:

感谢您注册 Android 地图 API 密钥!
您的密钥是:
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
我IE打开的时候是乱码,不知道是不是自己电脑有问题。后来改用了chrome就正常显示了。

到此,我们就完成了API Key的申请了,记录下Key值,在后续开发中使用。(放在layout中加入的MapView中)

二.Google Map API的使用

Android中定义了一个名为com.google.android.map的包,其中包含了一系列用于在google map上显示、控制和叠层信息的功能类,以下是该包中最重要的几个类:

1.MapActivity:这个类是用于显示Google Map的Activity类,它需要连接底层网络。MapActivity是一个抽象类,任何想要显示MapView的activity都需要派生自MapActivity,并且在其派生类的onCreate()中,都要创建一个MapView实例。

2.MapView:MapView是用于显示地图的View组件。它派生自android.view.ViewGroup。它必须和MapActivity配合使用,而且只能被MapActivity创建,这是因为MapView需要通过后台的线程来连接网络或者文件系统,而这些线程需要有MapActivity来管理。

3.MapController:MapController用于控制地图的移动、缩放等。

4.OverLay:这是一个可显示于地图之上的可绘制的对象。

5.GeoPoint:这是一个包含经纬度位置的对象。

三.实例开发

1.创建工程,注意SDK旋转为”Goolge APIs”

2.修改AndroidManifest.xml文件

由于使用Google Map API,所以必须添加<uses-library android:name=”com.google.android.maps” />

由于需要从网络获取地图数据,所以需要访问网络的权限<uses-permission android:name=”android.permission.INTERNET”/>

可能还需要添加其他权限。

例如:

AndroidManifest.xml

复制代码
<?xml version=”1.0″ encoding=”utf-8″?>
<manifest xmlns:android=”http://schemas.android.com/apk/res/android”
package=”com.yarin.android.Examples_09_03″
android:versionCode=”1″
android:versionName=”1.0″>
<application android:icon=”@drawable/icon” android:label=”@string/app_name”>
<uses-library android:name=”com.google.android.maps” />
<activity android:name=”.Activity01″
android:label=”@string/app_name”>
<intent-filter>
<action android:name=”android.intent.action.MAIN” />
<category android:name=”android.intent.category.LAUNCHER” />
</intent-filter>
</activity>
</application>
<uses-permission android:name=”android.permission.INTERNET” />
<uses-sdk android:minSdkVersion=”5″ />
</manifest>
复制代码

3.创建MapView

要显示地图,需要创建一个MapView,在Xml文件中的布局如下。其中的android:apiKey的值就是我们第一步申请的Key了。

main.xml

复制代码
<?xml version=”1.0″ encoding=”utf-8″?>
<RelativeLayout xmlns:android=”http://schemas.android.com/apk/res/android”
android:layout_width=”fill_parent”
android:layout_height=”fill_parent”
>
<com.google.android.maps.MapView
android:id=”@+id/MapView01″
android:layout_width=”fill_parent”
android:layout_height=”fill_parent”
android:apiKey=”0AubmfALdupLSlQkE67OTXgcQgWtyhXcO7uhsIQ”/>
</RelativeLayout>
复制代码

当然,可以在程序中通过如下代码来创建MapView:

MapView map = new MapView( this, “(android maps api key)”);

4.实现MapActivity

MapView需要由MapActivity来管理,所以程序部分应该继承自MapActivity类,必须实现isRouteDisplay方法。

MapView提供了3中模式的地图,分别可以通过以下方式设置采用什么模式来显示地图。

mMapView.setTraffic(true); //设置为交通模式

mMapView.setSatellite(true); //设置为卫星模式//

mMapView.setStreetView(false); //设置为街景模式

通过setBuiltZoomControls方法设置地图是否支持缩放。

5.MapController的使用

如果需要设置地图显示的地点以及放大倍数等,就需要使用MapController来控制地图。可以通过如下代码获得MapController对象:

mMapController = mMapView.getController();

要定位地点,需要构造一个GeoPoint来表示地点的经纬度,然后使用animateTo方法将地图定位到指定的GeoPoint上,代码如下:

//设置起点为成都
mGeoPoint = new GeoPoint((int) (30.659259 * 1000000), (int) (104.065762 * 1000000));
//定位到成都
mMapController.animateTo(mGeoPoint);

6.Ovelay的使用

如果需要在地图上标注一些图标文字等信息,就需要使用Overlay。这里我们首先要将地图上的经度和纬度转换成屏幕上的实际坐标,才能将信息绘制上去。Map API中提供了Projection.toPixels(GeoPoint in,GeoPoint out)方法,可以将经度和纬度转换成屏幕上的坐标。

首先需要实现OverLay中的draw方法才能在地图上绘制信息,代码如下:

复制代码
class MyLocationOverlay extends Overlay
{
@Override
public boolean draw(Canvas canvas, MapView mapView, boolean shadow, long when)
{
……..
}
}
复制代码

综合上面的代码如下

Activity01.java

复制代码
import java.util.List;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Point;
import android.os.Bundle;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;public class Activity01 extends MapActivity
{
private MapView mMapView;
private MapController mMapController;
private GeoPoint mGeoPoint;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mMapView = (MapView) findViewById(R.id.MapView01);
//设置为交通模式
// mMapView.setTraffic(true);
//设置为卫星模式
// mMapView.setSatellite(true);
//设置为街景模式
mMapView.setStreetView(false);
//取得MapController对象(控制MapView)
mMapController = mMapView.getController();
mMapView.setEnabled(true);
mMapView.setClickable(true);
//设置地图支持缩放
mMapView.setBuiltInZoomControls(true);

//设置起点为成都
mGeoPoint = new GeoPoint((int) (30.659259 * 1000000), (int) (104.065762 * 1000000));
//定位到成都
mMapController.animateTo(mGeoPoint);
//设置倍数(1-21)
mMapController.setZoom(15);

//添加Overlay,用于显示标注信息
MyLocationOverlay myLocationOverlay = new MyLocationOverlay();
List<Overlay> list = mMapView.getOverlays();
list.add(myLocationOverlay);
}
protected boolean isRouteDisplayed()
{
return false;
}
class MyLocationOverlay extends Overlay
{
@Override
public boolean draw(Canvas canvas, MapView mapView, boolean shadow, long when)
{
super.draw(canvas, mapView, shadow);
Paint paint = new Paint();
Point myScreenCoords = new Point();
// 将经纬度转换成实际屏幕坐标
mapView.getProjection().toPixels(mGeoPoint, myScreenCoords);
paint.setStrokeWidth(1);
paint.setARGB(255, 255, 0, 0);
paint.setStyle(Paint.Style.STROKE);
Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.home);
canvas.drawBitmap(bmp, myScreenCoords.x, myScreenCoords.y, paint);
canvas.drawText(“天府广场”, myScreenCoords.x, myScreenCoords.y, paint);
return true;
}
}
}

复制代码

android模拟器上网问题

归类于Android 参与评论

有可能是DNS的问题:

Android模拟器默认的地址是10.0.2.3,默认的DNS也是10.0.2.3,对于在家里上网学习Android的人(像我)来讲,一般电脑的IP都是192.168.1.100之类的,不在同一个网段。所以就会出现电脑可以上网但是模拟器不能上网的情况。其实设置方法很简单,只要把模拟器的默认DNS设置成电脑的DNS地址即可。

使用adb的shell,确认系统的各项属性

adb shell

getprop

getprop会列出系统当前的各项属性

在结果里可以看到:

[net.dns1]: [10.0.2.3]
[net.dns2]: [10.0.2.4]
[net.dns3]: [10.0.2.5]
[net.dns4]: [10.0.2.6]

第四步:把dns改成我们自己的DNS

setprop net.dns1 192.168.1.1

通过Android模拟器运行网络通信程序详细

归类于Android 参与评论

mars课程里关于Socket通信那一课说那些程序只能在真机上运行,模拟器模拟不了,实际上是可以的。
Android模拟器是通过一个类似路由器的虚拟网络层与电脑相连,可以看作模拟器是处于“内网”当中,每个模拟器都有自己的虚拟路由器,而且虚拟路由器的地址总是10.0.2.1,在模拟器看来,电脑的地址是10.0.2.2,模拟器自己的地址是10.0.2.15,无论你启动多少个模拟器,对于模拟器来说都是这样的地址,模拟器之间不能直接通信。
启动模拟器的时候,电脑会给模拟器分配两个端口,通过这两个端口,电脑就能操作模拟器。第一个启动的模拟器的端口是5554和5555,第二个是5556和5557,以此类推,最多可以同时启动32个模拟器。第一个端口(偶数端口)可以接受telnet连接,对模拟器进行设置,第二个端口(奇数端口)则接受adb连接,可以用来调试。第一个端口可以在模拟器窗口的标题栏看到,如下图所示:

5554表示端口号,t表示模拟器名称。
实际上,这些端口也是电脑监听的端口,在电脑上通过netstat可以看到本机正在监听这些端口,因此通过telnet localhost 5554就能连上第一台模拟器,连上之后通过help命令可以查看操作帮助。
为了实现电脑和模拟器上的android程序进行socket通信,需要把程序开启的端口通过端口映射设置到电脑上,这跟家里的路由器端口映射概念是一样的。telnet到模拟器之后,通过
redir add tcp:1234:1234
就能把模拟器上的1234端口映射到电脑上,第一个表示电脑端口,第二个表示模拟器程序要使用端口,这两个数字可以相同也可以不同,要映射udp端口就把tcp改为udp即可
redir add udp:1234:1234
这样一来,当模拟器的程序打开1234端口时,在电脑上也打开了对应的端口,只要通过电脑连接127.0.0.1的对应端口,就连上了模拟器的程序端口,就可以通过电脑上的client向模拟器的server发送数据,不需要通过真机运行。
如果要让第一个模拟器向第二个模拟器发送数据,也可以把第二个模拟器的端口映射到电脑上,然后在第一个模拟器程序中向10.0.2.2的对应端口发送数据即可。

模拟器还有一个很有意思的功能,每个模拟器默认的电话号码就是它的第一个端口号,例如开了两个模拟器,第一个拨打5556,第二个就会显示5554来电,还能接通,发短信也可以,这样就能模拟电话和短信功能。

详细的信息可以看Dev Guide的模拟器部分:http://developer.android.com/guide/developing/devices/emulator.html

自定义控件之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、这仅仅是@在字符串中的用法,有机会再去看看@的其他东东.

[详解+多图]赶紧收藏吧,Android开发环境配置搭建超级详细

归类于Android 参与评论

[详解+多图]赶紧收藏吧,Android开发环境配置搭建超级详细

一 相关下载
(1) java JDK下载:
进入该网页: http://java.sun.com/javase/downloads/index.jsp (或者直接点击下载)如下图:


选择 Download JDK 只下载JDK,无需下载jre.

(2)eclipse下载
进入该网页: http://www.eclipse.org/downloads/ (或者直接点击下载:BT下载    HTTP下载) 如下图:

我们选择第一个(即eclipse IDE for java EE Developers)
(3)下载Android SDK
说明: Android SDK两种下载版本,一种是包含具体版本的SDK的,一种是只有升级工具,而不包含具体的SDK版本,后一种大概20多M,前一种70多M。
完全版下载 (android sdk 2.1 r01)     升级版下载 (建议使用这个,本例子就是使用这个这里面不包含具体版本,想要什么版本在Eclipse里面升级就行)
二 软件安装
(1)安装jdk 6u19   安装完成即可,无需配置环境变量
(2)解压eclipse       eclipse无需安装,解压后,直接打开就行
(3)解压android sdk     这个也无需安装,解压后供后面使用
(4)最终有三个文件夹,如下图:

三 Eclipse配置
1 安装android 开发插件
(1)打开Eclipse, 在菜单栏上选择 help->Install New SoftWare 出现如下界面:

点击 Add按钮,出现如下界面

输入网址: https://dl-ssl.google.com/android/eclipse/    (如果出错,请将https改成http)
名称: Android (这里可以自定义)
点击OK,将出现如下界面

点击 Next按钮 ,出现如下界面:

点击Next按钮,出现如下界面:

选择 I accept the terms of the license agreements   点击Next,进入安装插件界面

安装完成后,出现如下界面

点击Yes按钮,重启Eclipse
2 配置android sdk
(1)点击菜单window->preferences,进入如下界面

选择你的android SDK解压后的目录,选错了就会报错,这个是升级工具,目前还没有一个版本的SDK
(2)升级SDK版本,选择菜单 window->Android sdk and avd manager 出现如下界面

选择update all按钮,出现如下界面

选择左边的某一项,点击accept表示安装,点击reject表示不安装,我这里只选了SDK 2.1 和samples for api 7 , 自己可以任意自定义,确定后,选择install按钮,进入安装界面如下:

安装完成如下:

(3)新建AVD(android vitural device)    和上面一样,进入android sdk and avd manager,选中Vitural Devices 在点击New按钮

点击New按钮后,进入如下界面:

名称可以随便取,target选择你需要的SDK版本,SD卡大小自定义,点击 Create AVD,得到如下结果

如上显示创建AVD完毕

3 新建Android项目
(1)选择菜单file->new->other 进入如下界面:

选择新建Android Project项目,点击Next按钮,进入如下界面

名称自定义,应用程序名自定义,报名必须包含一个点以上,min SDK version里面必须输入整数
点击Next出现如下界面:

注: 若有错误如: Project … is missing required source folder: ‘gen’ ,则将gen->Android.Test->R.java这个文件删掉,Eclipse会为我们重新生成这个文件,并且不会报错。
(3)配置运行
右键项目->Run as -> Run Configuration 进入如下界面:
该界面,点击Browse 按钮,选择你要运行的项目
选择Target切换到以下界面

该界面选择运行的AVD,将AVD前面的方框设置为选择状态。

(4)测试项目运行
右键项目名称->run as ->Android Application 即可启动运行该Android程序,如下所示:

正在进入

测试程序运行结果

四 结束语
至此,android开发环境搭建完毕,有问题请留言。在这里要注意,我这里只是下载了android sdk r4升级工具,没有下载具体的SDK,而是通过在Eclipse里面的Android Sdk管理工具升级的,你也可以直接下载具体的SDK版本,如: Android sdk 2.1 r1 上面有这个的下载链接,但我任务用升级工具更好。

log4j配置详解

归类于Log4j 参与评论

第一步:加入log4j-1.2.8.jar到lib下。

第二步:在CLASSPATH下建立log4j.properties。内容如下:

1 log4j.rootCategory=INFO, stdout , R

2

3 log4j.appender.stdout=org.apache.log4j.ConsoleAppender

4 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

5 log4j.appender.stdout.layout.ConversionPattern=[QC] %p [%t] %C.%M(%L) | %m%n

6

7 log4j.appender.R=org.apache.log4j.DailyRollingFileAppender

8 log4j.appender.R.File=D:\Tomcat 5.5\logs\qc.log

9 log4j.appender.R.layout=org.apache.log4j.PatternLayout

10 log4j.appender.R.layout.ConversionPattern=%d-[TS] %p %t %c – %m%n

11

12 log4j.logger.com.neusoft=DEBUG

13 log4j.logger.com.opensymphony.oscache=ERROR

14 log4j.logger.net.sf.navigator=ERROR

15 log4j.logger.org.apache.commons=ERROR

16 log4j.logger.org.apache.struts=WARN

17 log4j.logger.org.displaytag=ERROR

18 log4j.logger.org.springframework=DEBUG

19 log4j.logger.com.ibatis.db=WARN

20 log4j.logger.org.apache.velocity=FATAL

21

22 log4j.logger.com.canoo.webtest=WARN

23

24 log4j.logger.org.hibernate.ps.PreparedStatementCache=WARN

25 log4j.logger.org.hibernate=DEBUG

26 log4j.logger.org.logicalcobwebs=WARN

第三步:相应的修改其中属性,修改之前就必须知道这些都是干什么的,在第二部分讲解。

第四步:在要输出日志的类中加入相关语句:

定义属性:protected final Log log = LogFactory.getLog(getClass());

在相应的方法中:

if (log.isDebugEnabled())

{

log.debug(“System …..”);

}

二、Log4j说明

1 log4j.rootCategory=INFO, stdout , R

此句为将等级为INFO的日志信息输出到stdout和R这两个目的地,stdout和R的定义在下面的代码,可以任意起名。等级可分为OFF、 FATAL、ERROR、WARN、INFO、DEBUG、ALL,如果配置OFF则不打出任何信息,如果配置为INFO这样只显示INFO, WARN, ERROR的log信息,而DEBUG信息不会被显示,具体讲解可参照第三部分定义配置文件中的logger。

3 log4j.appender.stdout=org.apache.log4j.ConsoleAppender

此句为定义名为stdout的输出端是哪种类型,可以是

org.apache.log4j.ConsoleAppender(控制台),

org.apache.log4j.FileAppender(文件),

org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),

org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)

org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)

具体讲解可参照第三部分定义配置文件中的Appender。

4 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

此句为定义名为stdout的输出端的layout是哪种类型,可以是

org.apache.log4j.HTMLLayout(以HTML表格形式布局),

org.apache.log4j.PatternLayout(可以灵活地指定布局模式),

org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),

org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)

具体讲解可参照第三部分定义配置文件中的Layout。

5 log4j.appender.stdout.layout.ConversionPattern= [QC] %p [%t] %C.%M(%L) | %m%n

如果使用pattern布局就要指定的打印信息的具体格式ConversionPattern,打印参数如下:

%m 输出代码中指定的消息

%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL

%r 输出自应用启动到输出该log信息耗费的毫秒数

%c 输出所属的类目,通常就是所在类的全名

%t 输出产生该日志事件的线程名

%n 输出一个回车换行符,Windows平台为“rn”,Unix平台为“n”

%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921

%l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。

[QC]是log信息的开头,可以为任意字符,一般为项目简称。

输出的信息

[TS] DEBUG [main] AbstractBeanFactory.getBean(189) | Returning cached instance of singleton bean ‘MyAutoProxy’

具体讲解可参照第三部分定义配置文件中的格式化日志信息。

7 log4j.appender.R=org.apache.log4j.DailyRollingFileAppender

此句与第3行一样。定义名为R的输出端的类型为每天产生一个日志文件。

8 log4j.appender.R.File=D:\Tomcat 5.5\logs\qc.log

此句为定义名为R的输出端的文件名为D:\Tomcat 5.5\logs\qc.log

可以自行修改。

9 log4j.appender.R.layout=org.apache.log4j.PatternLayout

与第4行相同。

10 log4j.appender.R.layout.ConversionPattern=%d-[TS] %p %t %c – %m%n

与第5行相同。

12 log4j.logger.com. neusoft =DEBUG

指定com.neusoft包下的所有类的等级为DEBUG。

可以把com.neusoft改为自己项目所用的包名。

13 log4j.logger.com.opensymphony.oscache=ERROR

14 log4j.logger.net.sf.navigator=ERROR

这两句是把这两个包下出现的错误的等级设为ERROR,如果项目中没有配置EHCache,则不需要这两句。

15 log4j.logger.org.apache.commons=ERROR

16 log4j.logger.org.apache.struts=WARN

这两句是struts的包。

17 log4j.logger.org.displaytag=ERROR

这句是displaytag的包。(QC问题列表页面所用)

18 log4j.logger.org.springframework=DEBUG

此句为Spring的包。

24 log4j.logger.org.hibernate.ps.PreparedStatementCache=WARN

25 log4j.logger.org.hibernate=DEBUG

此两句是hibernate的包。

以上这些包的设置可根据项目的实际情况而自行定制。

三、log4j详解

1、定义配置文件

Log4j支持两种配置文件格式,一种是XML格式的文件,一种是Java特性文件log4j.properties(键=值)。下面将介绍使用log4j.properties文件作为配置文件的方法:

①、配置根Logger

Logger 负责处理日志记录的大部分操作。

其语法为:

log4j.rootLogger = [ level ] , appenderName, appenderName, …

其中,level 是日志记录的优先级,分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者自定义的级别。Log4j建议只使用四个级别,优 先级从高到低分别是ERROR、WARN、INFO、DEBUG。通过在这里定义的级别,您可以控制到应用程序中相应级别的日志信息的开关。比如在这里定 义了INFO级别,只有等于及高于这个级别的才进行处理,则应用程序中所有DEBUG级别的日志信息将不被打印出来。ALL:打印所有的日志,OFF:关 闭所有的日志输出。 appenderName就是指定日志信息输出到哪个地方。可同时指定多个输出目的地。

②、配置日志信息输出目的地 Appender

Appender 负责控制日志记录操作的输出。

其语法为:

log4j.appender.appenderName = fully.qualified.name.of.appender.class

log4j.appender.appenderName.option1 = value1

log4j.appender.appenderName.optionN = valueN

这里的appenderName为在①里定义的,可任意起名。

其中,Log4j提供的appender有以下几种:

org.apache.log4j.ConsoleAppender(控制台),

org.apache.log4j.FileAppender(文件),

org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),

org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),可通过 log4j.appender.R.MaxFileSize=100KB设置文件大小,还可通过 log4j.appender.R.MaxBackupIndex=1设置为保存一个备份文件。

org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)

例如:log4j.appender.stdout=org.apache.log4j.ConsoleAppender

定义一个名为stdout的输出目的地,ConsoleAppender为控制台。

③、配置日志信息的格式(布局)Layout

Layout 负责格式化Appender的输出。

其语法为:

log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class

log4j.appender.appenderName.layout.option1 = value1

log4j.appender.appenderName.layout.optionN = valueN

其中,Log4j提供的layout有以下几种:

org.apache.log4j.HTMLLayout(以HTML表格形式布局),

org.apache.log4j.PatternLayout(可以灵活地指定布局模式),

org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),

org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)

2、格式化日志信息

Log4J采用类似C语言中的printf函数的打印格式格式化日志信息,打印参数如下:

%m 输出代码中指定的消息

%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL

%r 输出自应用启动到输出该log信息耗费的毫秒数

%c 输出所属的类目,通常就是所在类的全名

%t 输出产生该日志事件的线程名

%n 输出一个回车换行符,Windows平台为“rn”,Unix平台为“n”

%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921

%l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。

3、在代码中使用Log4j

我们在需要输出日志信息的类中做如下的三个工作:

1、导入所有需的commongs-logging类:

import org.apache.commons.logging.Log;

import org.apache.commons.logging.LogFactory;

2、在自己的类中定义一个org.apache.commons.logging.Log类的私有静态类成员:

private final Log log = LogFactory.getLog(getClass());

LogFactory.getLog()方法的参数使用的是当前类的class。

3、使用org.apache.commons.logging.Log类的成员方法输出日志信息:

if (log.isDebugEnabled())
{
log.debug(“111″);
}
if (log.isInfoEnabled())
{
log.info(“222″);
}
if (log.isWarnEnabled())
{
log.warn(“333″);
}
if (log.isErrorEnabled())
{
log.error(“444″);
}
if (log.isFatalEnabled())
{
log.fatal(“555″)
}

Log4j配置详细Log4j怎么配置

归类于Log4j 参与评论

Log4J的配置文件(Configuration File)就是用来设置记录器的级别、存放器和布局的,它可接key=value格式的设置或xml格式的设置信息。通过配置,可以创建出Log4J的运行环境。

1. 配置文件
Log4J配置文件的基本格式如下:

#配置根Logger
log4j.rootLogger  =   [ level ]   ,  appenderName1 ,  appenderName2 ,  …

#配置日志信息输出目的地Appender
log4j.appender.appenderName  =  fully.qualified.name.of.appender.class
log4j.appender.appenderName.option1  =  value1

log4j.appender.appenderName.optionN  =  valueN

#配置日志信息的格式(布局)
log4j.appender.appenderName.layout  =  fully.qualified.name.of.layout.class
log4j.appender.appenderName.layout.option1  =  value1

log4j.appender.appenderName.layout.optionN  =  valueN

其中 [level] 是日志输出级别,共有5级:

FATAL       0
ERROR      3
WARN       4
INFO         6
DEBUG      7

Appender 为日志输出目的地,Log4j提供的appender有以下几种:
org.apache.log4j.ConsoleAppender(控制台),
org.apache.log4j.FileAppender(文件),
org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),
org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),
org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
Layout:日志输出格式,Log4j提供的layout有以下几种:

org.apache.log4j.HTMLLayout(以HTML表格形式布局),
org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)

打印参数: Log4J采用类似C语言中的printf函数的打印格式格式化日志信息,如下:

%m   输出代码中指定的消息
%p   输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
%r   输出自应用启动到输出该log信息耗费的毫秒数
%c   输出所属的类目,通常就是所在类的全名
%t   输出产生该日志事件的线程名
%n   输出一个回车换行符,Windows平台为“\r\n”,Unix平台为“\n”
%d   输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss , SSS},输出类似:2002年10月18日  22 : 10 : 28 , 921
%l   输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java: 10 )

2. 在代码中初始化Logger:
1)在程序中调用BasicConfigurator.configure()方法:给根记录器增加一个ConsoleAppender,输出格式通过PatternLayout设为”%-4r [%t] %-5p %c %x – %m%n”,还有根记录器的默认级别是Level.DEBUG.
2)配置放在文件里,通过命令行参数传递文件名字,通过PropertyConfigurator.configure(args[x])解析并配置;
3)配置放在文件里,通过环境变量传递文件名等信息,利用log4j默认的初始化过程解析并配置;
4)配置放在文件里,通过应用服务器配置传递文件名等信息,利用一个特殊的servlet来完成配置。

3. 为不同的 Appender 设置日志输出级别:
当调试系统时,我们往往注意的只是异常级别的日志输出,但是通常所有级别的输出都是放在一个文件里的,如果日志输出的级别是BUG!?那就慢慢去找吧。
这时我们也许会想要是能把异常信息单独输出到一个文件里该多好啊。当然可以,Log4j已经提供了这样的功能,我们只需要在配置中修改Appender的Threshold 就能实现,比如下面的例子:

[配置文件]

### set log levels ###
log4j.rootLogger = debug ,  stdout ,  D ,  E

### 输出到控制台 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern =  %d{ABSOLUTE} %5p %c{ 1 }:%L – %m%n

### 输出到日志文件 ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = logs/log.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG ## 输出DEBUG级别以上的日志
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] – [ %p ]  %m%n

### 保存异常信息到单独文件 ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = logs/error.log ## 异常日志文件名
log4j.appender.D.Append = true
log4j.appender.D.Threshold = ERROR ## 只输出ERROR级别以上的日志!!!
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] – [ %p ]  %m%n
[代码中使用]

public   class  TestLog4j   {
public   static   void  main(String[] args)   {
PropertyConfigurator.configure( ” D:/Code/conf/log4j.properties ” );
Logger logger  =  Logger.getLogger(TestLog4j. class );
logger.debug( ” debug ” );
logger.error( ” error ” );
}
}

运行一下,看看异常信息是不是保存在了一个单独的文件error.log中

log4j.properties 使用
一.参数意义说明
输出级别的种类
ERROR、WARN、INFO、DEBUG
ERROR 为严重错误 主要是程序的错误
WARN 为一般警告,比如session丢失
INFO 为一般要显示的信息,比如登录登出
DEBUG 为程序的调试信息
配置日志信息输出目的地
log4j.appender.appenderName = fully.qualified.name.of.appender.class
1.org.apache.log4j.ConsoleAppender(控制台)
2.org.apache.log4j.FileAppender(文件)
3.org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
4.org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)
5.org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
配置日志信息的格式
log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
1.org.apache.log4j.HTMLLayout(以HTML表格形式布局),
2.org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
3.org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
4.org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
控制台选项
Threshold=DEBUG:指定日志消息的输出最低层次。
ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
Target=System.err:默认情况下是:System.out,指定输出控制台
FileAppender 选项
Threshold=DEBUF:指定日志消息的输出最低层次。
ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
File=mylog.txt:指定消息输出到mylog.txt文件。
Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。
RollingFileAppender 选项
Threshold=DEBUG:指定日志消息的输出最低层次。
ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
File=mylog.txt:指定消息输出到mylog.txt文件。
Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。
MaxFileSize=100KB: 后缀可以是KB, MB 或者是 GB. 在日志文件到达该大小时,将会自动滚动,即将原来的内容移到mylog.log.1文件。
MaxBackupIndex=2:指定可以产生的滚动文件的最大数。
log4j.appender.A1.layout.ConversionPattern=%-4r %-5p %d{yyyy-MM-dd HH:mm:ssS} %c %m%n
日志信息格式中几个符号所代表的含义:
-X号: X信息输出时左对齐;
%p: 输出日志信息优先级,即DEBUG,INFO,WARN,ERROR,FATAL,
%d: 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921
%r: 输出自应用启动到输出该log信息耗费的毫秒数
%c: 输出日志信息所属的类目,通常就是所在类的全名
%t: 输出产生该日志事件的线程名
%l: 输出日志事件的发生位置,相当于%C.%M(%F:%L)的组合,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main (TestLog4.java:10)
%x: 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。
%%: 输出一个”%”字符
%F: 输出日志消息产生时所在的文件名称
%L: 输出代码中的行号
%m: 输出代码中指定的消息,产生的日志具体信息
%n: 输出一个回车换行符,Windows平台为”\r\n”,Unix平台为”\n”输出日志信息换行
可以在%与模式字符之间加上修饰符来控制其最小宽度、最大宽度、和文本的对齐方式。如:
1)%20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,默认的情况下右对齐。
2)%-20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,”-”号指定左对齐。
3)%.30c:指定输出category的名称,最大的宽度是30,如果category的名称大于30的话,就会将左边多出的字符截掉,但小于30的话也不会有空格。
4)%20.30c:如果category的名称小于20就补空格,并且右对齐,如果其名称长于30字符,就从左边较远输出的字符截掉。
二.文件配置Sample1
log4j.rootLogger=DEBUG,A1,R
#log4j.rootLogger=INFO,A1,R
# ConsoleAppender 输出
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p] %m%n
# File 输出 一天一个文件,输出路径可以定制,一般在根路径下
log4j.appender.R=org.apache.log4j.DailyRollingFileAppender
log4j.appender.R.File=blog_log.txt
log4j.appender.R.MaxFileSize=500KB
log4j.appender.R.MaxBackupIndex=10
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c] [%p] – %m%n
文件配置Sample2
下面给出的Log4J配置文件实现了输出到控制台,文件,回滚文件,发送日志邮件,输出到数据库日志表,自定义标签等全套功能。
log4j.rootLogger=DEBUG,CONSOLE,A1,im
#DEBUG,CONSOLE,FILE,ROLLING_FILE,MAIL,DATABASE
log4j.addivity.org.apache=true
###################
# Console Appender
###################
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.Threshold=DEBUG
log4j.appender.CONSOLE.Target=System.out
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=[framework] %d – %c -%-4r [%t] %-5p %c %x – %m%n
#log4j.appender.CONSOLE.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD] n%c[CATEGORY]%n%m[MESSAGE]%n%n
#####################
# File Appender
#####################
log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=file.log
log4j.appender.FILE.Append=false
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=[framework] %d – %c -%-4r [%t] %-5p %c %x – %m%n
# Use this layout for LogFactor 5 analysis
########################
# Rolling File
########################
log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender
log4j.appender.ROLLING_FILE.Threshold=ERROR
log4j.appender.ROLLING_FILE.File=rolling.log
log4j.appender.ROLLING_FILE.Append=true
log4j.appender.ROLLING_FILE.MaxFileSize=10KB
log4j.appender.ROLLING_FILE.MaxBackupIndex=1
log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.ROLLING_FILE.layout.ConversionPattern=[framework] %d – %c -%-4r [%t] %-5p %c %x – %m%n
####################
# Socket Appender
####################
log4j.appender.SOCKET=org.apache.log4j.RollingFileAppender
log4j.appender.SOCKET.RemoteHost=localhost
log4j.appender.SOCKET.Port=5001
log4j.appender.SOCKET.LocationInfo=true
# Set up for Log Facter 5
log4j.appender.SOCKET.layout=org.apache.log4j.PatternLayout
log4j.appender.SOCET.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD]%n%c[CATEGORY]%n%m[MESSAGE]%n%n
########################
# Log Factor 5 Appender
########################
log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender
log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000
########################
# SMTP Appender
#######################
log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender
log4j.appender.MAIL.Threshold=FATAL
log4j.appender.MAIL.BufferSize=10
log4j.appender.MAIL.From=chenyl@yeqiangwei.com
log4j.appender.MAIL.SMTPHost=mail.hollycrm.com
log4j.appender.MAIL.Subject=Log4J Message
log4j.appender.MAIL.To=chenyl@yeqiangwei.com
log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout
log4j.appender.MAIL.layout.ConversionPattern=[framework] %d – %c -%-4r [%t] %-5p %c %x – %m%n
########################
# JDBC Appender
#######################
log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.DATABASE.URL=jdbc:mysql://localhost:3306/test
log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver
log4j.appender.DATABASE.user=root
log4j.appender.DATABASE.password=
log4j.appender.DATABASE.sql=INSERT INTO LOG4J (Message) VALUES (‘[framework] %d – %c -%-4r [%t] %-5p %c %x – %m%n’)
log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout
log4j.appender.DATABASE.layout.ConversionPattern=[framework] %d – %c -%-4r [%t] %-5p %c %x – %m%n
log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender
log4j.appender.A1.File=SampleMessages.log4j
log4j.appender.A1.DatePattern=yyyyMMdd-HH’.log4j’
log4j.appender.A1.layout=org.apache.log4j.xml.XMLLayout
###################
#自定义Appender
###################
log4j.appender.im = net.cybercorlin.util.logger.appender.IMAppender
log4j.appender.im.host = mail.cybercorlin.net
log4j.appender.im.username = username
log4j.appender.im.password = password
log4j.appender.im.recipient = corlin@yeqiangwei.com
log4j.appender.im.layout=org.apache.log4j.PatternLayout
log4j.appender.im.layout.ConversionPattern =[framework] %d – %c -%-4r [%t] %-5p %c %x – %m%n
三.高级使用
实验目的:
1.把FATAL级错误写入2000NT日志
2. WARN,ERROR,FATAL级错误发送email通知管理员
3.其他级别的错误直接在后台输出
实验步骤:
输出到2000NT日志
1.把Log4j压缩包里的NTEventLogAppender.dll拷到WINNT\SYSTEM32目录下
2.写配置文件log4j.properties
# 在2000系统日志输出
log4j.logger.NTlog=FATAL, A8
# APPENDER A8
log4j.appender.A8=org.apache.log4j.nt.NTEventLogAppender
log4j.appender.A8.Source=JavaTest
log4j.appender.A8.layout=org.apache.log4j.PatternLayout
log4j.appender.A8.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x – %m%n
3.调用代码:
Logger logger2 = Logger.getLogger(“NTlog”); //要和配置文件中设置的名字相同
logger2.debug(“debug!!!”);
logger2.info(“info!!!”);
logger2.warn(“warn!!!”);
logger2.error(“error!!!”);
//只有这个错误才会写入2000日志
logger2.fatal(“fatal!!!”);
发送email通知管理员:
1. 首先下载JavaMail和JAF,

http://java.sun.com/j2ee/ja/javamail/index.html

http://java.sun.com/beans/glasgow/jaf.html

在项目中引用mail.jar和activation.jar。
2. 写配置文件
# 将日志发送到email
log4j.logger.MailLog=WARN,A5
#  APPENDER A5
log4j.appender.A5=org.apache.log4j.net.SMTPAppender
log4j.appender.A5.BufferSize=5
log4j.appender.A5.To=chunjie@yeqiangwei.com
log4j.appender.A5.From=error@yeqiangwei.com
log4j.appender.A5.Subject=ErrorLog
log4j.appender.A5.SMTPHost=smtp.263.net
log4j.appender.A5.layout=org.apache.log4j.PatternLayout
log4j.appender.A5.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x – %m%n
3.调用代码:
//把日志发送到mail
Logger logger3 = Logger.getLogger(“MailLog”);
logger3.warn(“warn!!!”);
logger3.error(“error!!!”);
logger3.fatal(“fatal!!!”);
在后台输出所有类别的错误:
1. 写配置文件
# 在后台输出
log4j.logger.console=DEBUG, A1
# APPENDER A1
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x – %m%n
2.调用代码
Logger logger1 = Logger.getLogger(“console”);
logger1.debug(“debug!!!”);
logger1.info(“info!!!”);
logger1.warn(“warn!!!”);
logger1.error(“error!!!”);
logger1.fatal(“fatal!!!”);
——————————————————————–
全部配置文件:log4j.properties
# 在后台输出
log4j.logger.console=DEBUG, A1
# APPENDER A1
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x – %m%n
# 在2000系统日志输出
log4j.logger.NTlog=FATAL, A8
# APPENDER A8
log4j.appender.A8=org.apache.log4j.nt.NTEventLogAppender
log4j.appender.A8.Source=JavaTest
log4j.appender.A8.layout=org.apache.log4j.PatternLayout
log4j.appender.A8.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x – %m%n
# 将日志发送到email
log4j.logger.MailLog=WARN,A5
#  APPENDER A5
log4j.appender.A5=org.apache.log4j.net.SMTPAppender
log4j.appender.A5.BufferSize=5
log4j.appender.A5.To=chunjie@yeqiangwei.com
log4j.appender.A5.From=error@yeqiangwei.com
log4j.appender.A5.Subject=ErrorLog
log4j.appender.A5.SMTPHost=smtp.263.net
log4j.appender.A5.layout=org.apache.log4j.PatternLayout
log4j.appender.A5.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x – %m%n
全部代码:Log4jTest.java

/*
* 创建日期 2003-11-13
*/
package edu.bcu.Bean;
import org.apache.log4j.*;
//import org.apache.log4j.nt.*;
//import org.apache.log4j.net.*;
/**
* @author yanxu
*/
public class Log4jTest
{
public static void main(String args[])
{
PropertyConfigurator.configure(“log4j.properties”);
//在后台输出
Logger logger1 = Logger.getLogger(“console”);
logger1.debug(“debug!!!”);
logger1.info(“info!!!”);
logger1.warn(“warn!!!”);
logger1.error(“error!!!”);
logger1.fatal(“fatal!!!”);
//在NT系统日志输出
Logger logger2 = Logger.getLogger(“NTlog”);
//NTEventLogAppender nla = new NTEventLogAppender();
logger2.debug(“debug!!!”);
logger2.info(“info!!!”);
logger2.warn(“warn!!!”);
logger2.error(“error!!!”);
//只有这个错误才会写入2000日志
logger2.fatal(“fatal!!!”);
//把日志发送到mail
Logger logger3 = Logger.getLogger(“MailLog”);
//SMTPAppender sa = new SMTPAppender();
logger3.warn(“warn!!!”);
logger3.error(“error!!!”);
logger3.fatal(“fatal!!!”);
}
}

正确配置和维护Apache安全性

归类于Apache 参与评论

【编者按】
在目前的Internet时代,主页已成为树立公司形象和展示自我天地的一个重要手段,配置一台强大且安全的Web Server就显得尤其重要。在众多的Web Server产品中,Apache是应用最为广泛的一个产品,同时也是一个设计上非常安全的程序。但是,同其它应用程序一样,Apache也存在安全缺陷。本文将详细介绍如何正确配置和维护Apache WEB Server的安全性问题等。

——————————————————————————–

一,Apache服务器的介绍

Apache服务器它是Internet网上应用最为广泛的Web服务器软件之一。Apache服务器源自美国国家超级技术计算应用中心(NCSA)的Web服务器项目中。目前已在互联网中占据了领导地位。Apache服务器得经过精心配置之后,才能使它适应高负荷,大吞吐量的互联网工作。快速、可靠、通过简单的API扩展,Perl/Python解释器可被编译到服务器中,且完全免费,完全源代码开放。如果你需要创建一个每天有数百万人访问的Web服务器,Apache可能是最佳选择。

二,Apache服务器的主要安全缺陷

正如我们前言所说尽管Apache服务器应用最为广泛,设计上非常安全的程序。但是同其它应用程序一样,Apache也存在安全缺陷。毕竟它是完全源代码,Apache服务器的安全缺陷主要是使用HTTP协议进行的拒绝服务攻击(denial of service)、缓冲区溢出攻击以及被攻击者获得root权限三缺陷和最新的恶意的攻击者进行“拒绝服务”(DoS)攻击。合理的网络配置能够保护Apache服务器免遭多种攻击。我们来介绍一下主要的安全缺陷:

(1)使用HTTP协议进行的拒绝服务攻击(denial of service)的安全缺陷

这种方法攻击者会通过某些手段使服务器拒绝对HTTP应答。这样会使Apache对系统资源(CPU时间和内存)需求的剧增,最终造成Apache系统变慢甚至完全瘫痪。

(2)缓冲区溢出的安全缺陷

该方法攻击者利用程序编写的一些缺陷,使程序偏离正常的流程。程序使用静态分配的内存保存请求数据,攻击者就可以发送一个超长请求使缓冲区溢出。比如一些Perl编写的处理用户请求的网关脚本。一旦缓冲区溢出,攻击者可以执行其恶意指令或者使系统宕机。

(3)被攻击者获得root权限的安全缺陷

该安全缺陷主要是因为Apache服务器一般以root权限运行(父进程),攻击者会通过它获得root权限,进而控制整个Apache系统。

(4)恶意的攻击者进行“拒绝服务”(DoS)攻击的安全缺陷

这个最新在6月17日发现的漏洞,它主要是存在于Apache的chunk encoding中,这是一个HTTP协议定义的用于接受web用户所提交数据的功能。 利用黑客程序可以对于运行在FreeBSD 4.5, OpenBSD 3.0 / 3.1, NetBSD 1.5.2平台上的Apache服务器均可进行有效的攻击.

所有说使用最高和最新安全版本对于加强Apache Web服务器的安全是至关重要的。请广大Apache服务器管理员去http://www.apache.org/dist/httpd/下载补丁程序以确保其WEB服务器安全!

三, 正确维护和配置Apache服务器

虽然Apache服务器的开发者非常注重安全性,由于Apache服务器其庞大的项目,难免会存在安全隐患。正确维护和配置Apache WEB服务器就很重要了。我们应注意的一些问题:

(1)Apache服务器配置文件

Apache Web服务器主要有三个配置文件,位于/usr/local/apache/conf目录下。这三个文件是:

httpd.con—–>主配置文件

srm.conf——>填加资源文件

access.conf—>设置文件的访问权限

注:具体配置可以参考:http://httpd.apache.org/docs/mod/core.html

(2)Apache服务器的日志文件

我们可以使用日志格式指令来控制日志文件的信息。使用Logformat “%a %l”指令,可以把发出HTTP请求浏览器的IP地址和主机名记录到日志文件。出于安全的考虑,在日志中我们应知道至少应该那些验证失败的WEB用户,在http.conf文件中加入Logformat “%401u”指令可以实现这个目的。这个指令还有其它的许多参数,用户可以参考Apache的文档。另外,Apache的错误日志文件对于系统管理员来说也是非常重要的,错误日志文件中包括服务器的启动、停止以及CGI执行失败等信息。更多请参看Apache日志系列1-5。

(3)Apache服务器的目录安全认证

在Apache Server中是允许使用 .htaccess做目录安全保护的,欲读取这保护的目录需要先键入正确用户帐号与密码。这样可做为专门管理网页存放的目录或做为会员区等。

在保护的目录放置一个档案,档名为.htaccss

AuthName “会员专区”

AuthType “Basic”

AuthUserFile “/var/tmp/xxx.pw” —–>把password放在网站外

require valid-user

到apache/bin目录,建password档

% ./htpasswd -c /var/tmp/xxx.pw username1 —–>第一次建档要用参数”-c”

% ./htpasswd /var/tmp/xxx.pw username2

这样就可以保护目录内的内容,进入要用合法的用户.

注:采用了Apache内附的模组。也可以采用在httpd.conf中加入:

options indexes followsymlinks

allowoverride authconfig

order allow,deny

allow from all

(4)Apache服务器访问控制

我们就要看三个配置文件中的第三个文件了,即access.conf文件,它包含一些指令控制允许什么用户访问Apache目录。应该把deny from all设为初始化指令,再使用allow from指令打开访问权限。

 

 

order deny,allow

deny from all

allow from safechina.net

 

 

设置允许来自某个域、IP地址或者IP段的访问。

(5)Apache服务器的密码保护问题

我们再使用.htaccess文件把某个目录的访问权限赋予某个用户。系统管理员需要在httpd.conf或者srm.conf文件中使用AccessFileName指令打开目录的访问控制。如:

AuthName PrivateFiles

AuthType Basic

AuthUserFile /path/to/httpd/users

require Phoenix

# htpasswd -c /path/to/httpd/users Phoenix

四,设置Apache服务器的WEB和文件服务器

我们在Apache服务器上存放WEB服务器的文件,供用户访问,并设置/home/ftp/pub目录为文件存放区域,用http://download.your.com/pub/来访问。在防火墙上设置apache反向代理技术,由防火墙代理访问。

(1)Apache服务器的设置

apache服务器采用默认配置。主目录为/home/httpd/html,主机域名为Phoenix.your.com,且别名到www.your.com中, 并且设置srm.conf加一行别名定义如下:

Alias /pub /home/ftp/pub/

更改默认应用程序类型定义如下:

DefaultType application/octet-stream
最后在/etc/httpd/conf/access.conf中增加一项定义
Options Indexes
AllowOverride AuthConfig
order allow,deny
allow from all
注:Options Indexes允许在找不到index.html文件的情况下允许列出目录/文件列表。
AllowOverride AuthConfig允许做基本的用户名和口令验证。这样的话,
需要在/home/ftp/pub目录下放入.htaccess,内容如下:
[root@shopu pub]# more .htaccess
AuthName Branch Office Public Software Download Area
AuthType Basic
AuthUserFile /etc/.usrpasswd
require valid-user
用# htpasswd -c /etc/.usrpasswd user1  分别创建不同的允许访问/pub下文件服务的外部用户名和口令。

 
(2)在防火墙上配置反向代理技术.
在/etc/httpd/conf/httpd.conf  中加入 NameVirtualHost xxx.xxx.xxx.xxx
# xxx.xxx.xxx.xxx —–>是防火墙外部在互联网上永久IP地址
servername www.your.com
errorlog /var/log/httpd/error_log
transferlog /var/log/httpd/access_log
rewriteengine on
proxyrequests off
usecanonicalname off
rewriterule ^/(.*)$ http://xxx.xxx.xx.x/$1 Apache服务器的IP地址。

servername http://download.your.com/pub/
errorlog /var/log/httpd/download/error_log
transferlog /var/log/httpd/download/access_log
rewriteengine on
proxyrequests off
usecanonicalname off
rewriterule ^/(.*)$ http://xxx.xxx.xx.x/$1 同上Apache服务器的IP地址。

 
设置防火墙上的DNS,让download.your.com和www.your.com都指向防火墙的外部网地址xxx.xxx.xxx.xxx。用http://www.your.com访问主页,用http://download.your.com/pub/访问公共文件的下载区。

注:还需要在apache服务器主机上建立目录/var/log/httpd/download/,否则会出错。另外,也可以设置防火墙主机上的/home/httpd/html/index.html的属性为750来阻止访问,这是防外部用户能访问到防火墙上的Apache服务器的http://www.your.com中。

总结:Apache Server是一个非常优秀,非常棒的服务器,只要你正确配置和维护好Apache服务器,你就会感受到Apache Server 所带来的好处,同样希望你能够通过阅读本文达到理论和实践双丰收的目的。谢谢。

经典的apache+tomcat虚拟机配置

归类于Apache 参与评论

经典的apache+tomcat虚拟机配置

2010-08-12 09:31:04|  分类: 中间件应用服务器 |  标签:longbank  usr  root  tomcat  apache     字号:大中小 订阅
安装所需文件:
jdk-1_5_0_06-linux-i586.rpm
http-2.2.0.tar.gz
apache-tomcat-5.5.16.tar.gz
jakarta-tomcat-connectors-jk-1.2.6.tar.gz
将安装软件都放在一个目录下,我暂且放在/usr/local下
(1)JDK的安装
[root@longbank]cd /usr/local
[root@longbank]rpm ivh  jdk-1_5_0_06-linux-i586.rpm
[root@longbank]vi /etc/profile
配置JDK   进入界面后按 i
JAVA_HOME=/usr/java/jdk1.5.0_06
PATH=$JAVA_HOME/bin:$PATH
CLASSPATH=.:$JAVA_HOME/lib/tools.jar;$JAVA_HOEM/lib/dt.jar
export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE INPUTRC CLASSPATH JAVA_HOME
然后按Esc,接着同时按下shift与:,输入wq保存退出
(1) apache的安装:
[root@longbank] cd /usr/local
[root@longbank] tar zxvf http-2.2.0.tar.gz
[root@longbank] cd httpd-2.2.0
[root@longbank] ./configure –prefix=/usr/local/apache –with-mpm=worker –enable-mods-shared=all
–enable-proxy –enable-proxy-http –enable-proxy-ajp –enable-proxy-balancer
–enable-proxy-ftp –enable-proxy-connect
–enable-so –enable-modules=so
[root@longbank] make
[root@longbank] make install
[root@longbank]vi /etc/profile
配置tomcat  进入界面后按 i
TOMCAT_HOME=/usr/local/apache-tomcat-5.5.16
在export 中加入TOMCAT_HOME
然后按Esc,接着同时按下shift与:,输入wq保存退出

(2)tomcat的安装:
[root@longbank] cd /usr/local
[root@longbank] tar zxvf apache-tomcat-5.5.16.tar.gz
[root@longbank]
(3) Connectors的安装:
[root@longbank] tar zxvf jakarta-tomcat-connectors-jk-1.2.6.tar.gz
[root@longbank] cd jakarta-tomcat-connectors-jk-src/jk/native
[root@longbank] ./buildconf.sh
[root@longbank] ./configure –with-apxs=/usr/local/apache/bin/apxs
[root@longbank] make
[root@longbank] make install

[root@longbank] vi /usr/local/apache/conf/httpd.conf

listen 80 改为:listen 192.168.10.83:80
注释掉:DocumentRoot /usr/local/apache/htdocs
注释掉:serverAdmin
注释掉:serverName

在文件末尾添加如下内容:

#add mod_jk module
LoadModule jk_module modules/mod_jk.so
# Update this path to match your modules location
# Where to find workers.properties
# Update this path to match your conf directory location (put workers.properties next to httpd.conf)
JkWorkersFile /usr/local/apache/conf/workers.properties
# Where to put jk logs
# Update this path to match your logs directory location (put mod_jk.log next to access_log)
JkLogFile     /usr/local/apache/conf/mod_jk.log
# Set the jk log level [debug/error/info]
JkLogLevel    info
# Select the log format
JkLogStampFormat “[%a %b %d %H:%M:%S %Y] ”
# JkOptions indicate to send SSL KEY SIZE,
JkOptions     +ForwardKeySize +ForwardURICompat -ForwardDirectories
# JkRequestLogFormat set the request format
JkRequestLogFormat     “%w %V %T”
# Send everything for context /examples to worker named worker1 (ajp13)
JkMount /*.jsp worker1
JkMount /server/* worker1

新建此文件/usr/localapache/conf/workers.properties 添加如下内容:
# Define 1 real worker using ajp13
worker.list=worker1
# Set properties for worker1 (ajp13)
worker.worker1.type=ajp13
worker.worker1.host=localhost
worker.worker1.port=8009
worker.worker1.lbfactor=50
worker.worker1.cachesize=10
worker.worker1.cache_timeout=600
worker.worker1.socket_keepalive=1
worker.worker1.reclycle_timeout=300

.指定虚拟主机配置文件
440 #Virtual hosts
441 #Include conf/extra/httpd-vhosts.conf
将441行的注释去掉,就可以拉。
4.进入/conf/extra
[root @ longbank] #vi httpd-vhosts dot conf
NameVirtualHost 192.168.10.83:80
<VirtualHost 124.42.108.146:80>
ServerName news.longbank.com.cn
<Directory “/usr/fw104/apache-tomcat-5.5.16/webapps/WebModule1″>
DirectoryIndex index.htm index.jsp index.html
</Directory>
DocumentRoot /usr/fw104/apache-tomcat-5.5.16/webapps/WebModule1
<IfModule mod_proxy.c>
ProxyPass /WebModule1/
http://news.longbank.com.cn:82/
ProxyPassReverse /WebModule1/ http://news.longbank.com.cn:82/
</IfModule>
</VirtualHost>
<VirtualHost 124.42.108.146:80>
ServerName
www.longbank.com.cn
   <Directory “/usr/fw104/apache-tomcat-5.5.16/webapps/WebModule1″>
DirectoryIndex index.htm index.jsp index.html
</Directory>
DocumentRoot /usr/fw104/apache-tomcat-5.5.16/webapps/WebModule1
<IfModule mod_proxy.c>
ProxyPass /WebModule1/
http://www.longbank.com.cn:82/
ProxyPassReverse /WebModule1/ http://www.longbank.com.cn:82/
</IfModule>
</VirtualHost>
接着配置tomcat
[root@longbank] vi /usr/local/apache-tomcat-5.5.16/conf/server.xml
将80改为82
接着加入
<Host name=”news.longbank.com.cn” appBase=”webapps” unpackWARs=”true” autoDeploy=”true”
xmlValidation=”false” xmlNamespaceAware=”false”>
<Context path=”" docBase=”/usr/fw104/apache-tomcat-5.5.16/webapps/WebModule1″ debug=”1″>
</Context>
</Host>
<Host name=”
www.longbank.com.cn” appBase=”webapps”
unpackWARs=”true” autoDeploy=”true”
xmlValidation=”false” xmlNamespaceAware=”false”>
<Context path=”" docBase=”/usr/fw104/apache-tomcat-5.5.16/webapps/WebModule1″  debug=”1″>
</Context>
</Host>

OK.大公告成,然后只需要在购买域名的网站将IP指到这台机器的交换机,然后交换机指到这台82的机器就好使了

Apache优化管理

归类于Apache 参与评论

Apache优化管理

关键词: apache install php resin mod_gzip mod_expire webalizer cronolog
内容摘要:
Apache是一个历史悠久并且功能十分强大的WEB服务器,但其丰富的功能对于一个新手来说往往不知道从何下手。我个人感觉Apache的设计充
分体现了模块化设计的优势,通过在动态模块加载(DSO)模式下的安装,任何子应用模块都可以通过配置文件的简单修改进行积木式的灵活配置。安装的过程可
以从简单的静态html服务开始,一个模块一个模块的学习使用。从单纯的HTML静态服务(core),到复杂的动态页面服务(core + php,
core + resin, core + php + mod_gzip, core + resin + mod_expire)。
本文主要从简化安装==>性能调优==>维护方便的角度,介绍了WEB服务的规划、HTTPD安装/应用模块配置、升级/维护等过程。让Apache和PHP,Resin等应用模块的独立升级,完全互不影响。
WEB应用容量规划
:根据硬件配置和WEB应用的特点进行WEB服务的规划及一些简单的估算公式;
Apache安装过程
:apache的通用的简化安装选项,方便以后的应用的模块化配置;
修改 HARD_SERVER_LIMIT:
vi /path/to/apache_src/src/include/httpd.h
#define HARD_SERVER_LIMIT 2560
可选应用模块/工具的安装
:php resin mod_gzip mod_expire及各个模块之间的配合;
mod_php安装:./configure –with-apxs=/home/apache/bin/apxs –enable-track-vars –with-mysql
mod_resin安装:./configure –with-apxs=/home/apache/bin/apxs
mod_gzip安装:修改Makefile中的 apxs路径:然后make make install
工具:日志轮循工具cronolog安装:http://www.cronolog.org
升级/维护
:看看通用和模块化的安装过程如何简化了日常的升级/维护工作;
按照以上的方法:系统管理员和应用管理员的职责可以清楚的分开,互相独立。
系统安装:系统管理员的职责就是安装好一台DSO模式的Apache,然后COLON即可,
应用安装:由应用管理员负责具体应用所需要的模块,比如PHP Resin等,并设置httpd.conf中相关的配置。
系统升级:系统管理员:升级操作系统/升级Apache
应用升级:应用管理员:升级应用模块,PHP Resin等。
WEB应用的容量规划
Apache主要是一个内存消耗型的服务应用,我个人总结的经验公式:
apache_max_process_with_good_perfermance Apache安装过程
服务器个数的硬上限HARD_SERVER_LIMIT的修改:
在Apache的源代码中缺省的最大进程数是256个,需要修改apache_1.3.xx/src/include/httpd.h
#ifndef HARD_SERVER_LIMIT
#ifdef WIN32
#define HARD_SERVER_LIMIT 1024
#elif defined(NETWARE)
#define HARD_SERVER_LIMIT 2048
#else
#define HARD_SERVER_LIMIT 2560 httpd.conf
需要修改的通用项目有以下几个:
#服务端口,缺省是8080,建议将整个Apache配置调整好后再将服务端口改到正式服务的端口
Port 8080 => 80
#服务器名:缺省没有
ServerName name.example.com
#最大服务进程数:根据服务容量预测设置
MaxClients 256 => 800
#缺省启动服务后的服务进程数:等服务比较平稳后,按平均负载下的httpd个数设置就可以
StartServers 5 => 200
不要修改:
以前有建议说修改:
MinSpareServers 5 => 100
MaxSpareServers 10 => 200
但从我的经验看来:缺省值已经是非常优化的了,而且让Apache自己调整子共享进程个数还是比较好的。
特别修改:
在solaris或一些比较容易出现内存泄露的应用上:
MaxRequestsPerChild 0 =>3000
应用模块和工具的安装配置:
由于使用模块动态加载的模式,所以可以方便的通过简单的配置调整来把Apache定制成你需要的:最好把不常用模块全部清除(无论处于安全还是效率)。
比如:对于静态页面服务器:就什么其他子模块都不加载,对于PHP应用就加上PHP模块,对于JAVA应用就把Resin模块加载上。而且各种模块的插拔非常简单,这样调试过程中就可以简单的通过注释掉不需要的模块,而不用重新编译。
一般说来,可以不需要的模块包括:
#LoadModule env_module libexec/mod_env.so
#LoadModule negotiation_module libexec/mod_negotiation.so
#LoadModule status_module libexec/mod_status.so
#server side include已经过时了
#LoadModule includes_module libexec/mod_include.so
#不需要将没有缺省index文件的目录下所有文件列出
#LoadModule autoindex_module libexec/mod_autoindex.so
#尽量不使用CGI:一直是Apache安全问题最多的地方
#LoadModule cgi_module libexec/mod_cgi.so
#LoadModule asis_module libexec/mod_asis.so
#LoadModule imap_module libexec/mod_imap.so
#LoadModule action_module libexec/mod_actions.so
#不使用安全认证可以大大提高访问速度
#LoadModule access_module libexec/mod_access.so
#LoadModule auth_module libexec/mod_auth.so
#LoadModule setenvif_module libexec/mod_setenvif.so
最好保留的有:
#用于定制log格式
LoadModule config_log_module libexec/mod_log_config.so
#用于增加文件应用的关联
LoadModule mime_module libexec/mod_mime.so
#用于缺省index文件:index.php等
LoadModule dir_module libexec/mod_dir.so
可用可不用的有:
#比如:需要在~/username/下调试php可以将
LoadModule userdir_module libexec/mod_userdir.so
#比如:需要将以前的URL进行转向或者需要使用CGI script-alias
LoadModule alias_module libexec/mod_alias.so
常用的模块:
最常用的可能就是php和JAVA应用服务器的前端,此外,从性能上讲利用mod_gzip可以减少40%左右的流量,减少机
器用于传输的负载,而
mod_expires可以减少10%左右的重复请求,让重复的用户对指定的页面请求结果都CACHE在本地,根本不向服务器发出请求。
建议将所有MODULE的配置都放到相应模块的配置内部:some_module config
PHP的安装:
/path/to/php_src/configure –with-apxs=/path/to/apache/bin/apxs –with-other-modules-you-need
需要修改的配置:
AddType application/x-httpd-php .php .php3 .any_file_in_php
resin的安装设置:
/path/to/resin/src/configure –with-apxs=/path/to/apache/bin/apxs
具体的resin设置放在另外一个文件中:比如/home/resin/conf/resin.conf
CauchoConfigFile /path/to/apache/conf/resin.conf
mod_expires的安装配置:
ExpiresActive on
ExpiresByType image/gif “access plus 1 month”
ExpiresByType text/css “now plus 1 month”
ExpiresDefault “now plus 1 day”
注释:
所有的.gif文件1个月以后过期
所有的文件缺省1天以后过期
mod_gzip的安装

http://www.chedong.com/tech/compress.html

日志的轮循:cronolog的安装和设置
cronolog可以非常整齐的将日志按天轮循存储
缺省编译安装到/usr/local/bin/下,只需要将配置改成:
CustomLog “|/usr/local/sbin/cronolog /home/apache/logs/%w/access_log” combined
日志将按天截断并存放在以星期为目录名的目录下:比如:log/1是周一,log/5是周五, log/0是周日
用gzip压缩每天的日志:
30 4 * * * /usr/bin/gzip -f /home/apache/logs/`date -d yesterday +%w`/access_log
日志的定期删除:
30 5 * * */usr/bin/find /home/apache/logs/ -name access_log.gz -mtime +3 |xargs -r /bin/rm -f
升级维护:
由于使用动态模块加载方式(DSO模式)安装Apache,Apache的HTTPD核心服务和应用模块以及应用模块之间都变的非常灵活,建议将所有独立模块的配置都放在
CONFIGURATIONS..
里,这样配置非常容易通过屏蔽某个模块来进行功能调整:比如:
#AddModule mod_gzip.c
就屏蔽了mod_gzip,而其他模块不首任何影响。
安装和维护过程:
系统安装:系统管理员的职责就是安装系统和一个按照DSO模式安装的Apache,然后COLON。
应用安装:由应用管理员负责具体应用所需要的模块并设置HTTPD。
系统升级:系统管理员:升级系统/升级Apache
应用升级:应用管理员:升级应用模块:PHP CAUCHO等
系统备份/恢复:如果Apache不在缺省的系统盘上,只需要将Apache目录备份就可以了,遇到系统分区的硬件问题直接使用预先准备好的系统COLON,再直接将Apache所在物理盘恢复就行了。
系统管理员:Apache的最简化安装
OS + Apache (httpd core only)
应用管理员:应用模块定制
纯静态页面服务
core
PHP动态页面
core+so
+php
JAVA应用
core+so
+caucho
+ssl
应用例子:
www.example.com
image.example.com
bbs.example.com
mall.example.com
例子:Apache和PHP模块的独立升级。
如果Apache是按照以下方式安装:
./configure –prefix=/home/apache –enable-shared=max –enable-module=most
PHP是按照以下方式安装:
./configure –with-apxs=/home/apache/bin/apxs –enable-track-vars –with-mysql
以后单独升级Apache的时候,仍然是:
./configure –prefix=/home/apache –enable-shared=max –enable-module=most
make
su
#/home/apache/bin/apachectl stop
#make install
单独升级php时,仍然是:
./configure –with-apxs=/home/apache/bin/apxs –enable-track-vars –with-mysql
make
su
#/home/apache/bin/apachectl stop
#make install
#/home/apache/bin/apachectl start
基于反相代理的WEB加速:
squid和mod_proxy都可以实现反相代理加速。而基于缓存的代理加速比起原有WEB服务,速度会有数量级的提升。
小提示:
Apache安装后,缺省根目录下没有但很有用的2个文件:
favicon.ico: favicon.ico是一个16×16的站点图标文件,如果浏览器发现有这个文件,在地址栏中会用这个图标替换调浏览器的网页图标。IE6和 MOZILLA等主流浏览器都支持这个功能。
例如:
http://www.chedong.com/favicon.ico

robots.txt: 用于告诉搜索引擎的爬虫程序(spider)网站那些页面可以被索引,那些不可以。
具体说明请参考:
http://www.robotstxt.org/wc/robots.html
参考文档:
Apache项目
http://httpd.apache.org
PHP
http://www.php.net
Resin
http://www.caucho.com
mod_gzip
http://sourceforge.net/projects/mod-gzip/
Cronolog
http://www.cronolog.org
mod_expires
http://httpd.apache.org/docs/mod/mod_expires.html
面向搜索引擎的CMS设计:
http://www.chedong.com/tech/cms.html

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/6797/showart_95142.html

,

教你20法 轻轻松松把 Apache 配置安全

归类于Apache 参与评论

下面介绍20种让你的Apache配置更安全的方法。

声明:关于安全的事情没有保证的或者绝对的。这些建议可以让你的服务器更安全,但不要认为遵循这些建议后你的服务器就理所当然是安全的。

另外,在这些建议中有的建议可能会降低服务器性能或者因为你的环境引起问题。我建议所作的任何改变是否适合你的需求完全由你决定。换句话说,那是你的风险。

一、确保你安装的是最新的补丁

如果门是敞开的话,在窗户上加锁就毫无意义。同样道理,如果你没有打补丁,继续下面的操作就没有什么必要。

二、隐藏Apache的版本号及其它敏感信息

默认情况下,很多Apache安装时会显示版本号及操作系统版本,甚至会显示服务器上安装的是什么样的Apache模块。这些信息可以为黑客所用,并且黑客还可以从中得知你所配置的服务器上的很多设置都是默认状态。

这里有两条语句,你需要添加到你的httpd.conf文件中:

ServerSignature Off

ServerTokens Prod

ServerSignature 出现在Apache所产生的像404页面、目录列表等页面的底部。ServerTokens目录被用来判断Apache会在Server HTTP响应包的头部填充什么信息。如果把ServerTokens设为Prod,那么HTTP响应包头就会被设置成:

Server:Apache

如果你非常想尝试其它事物,你可以通过编辑源代码改成不是Apache的其它东西,或者你可以通过下面将要介绍的mod_security实现。

三、确保Apache以其自身的用户账号和组运行

有的Apache安装过程使得服务器以nobody的用户运行,所以,假定Apache和你的邮件服务器都是以nobody的账号运行的,那么通过Apache发起的攻击就可能同时攻击到邮件服务器,反之亦然。

User apache

Group apache

四、确保web根目录之外的文件没有提供服务

我们不让Apache访问web根目录之外的任何文件。假设你的所以web站点文件都放在一个目录下(例如/web),你可以如下设置:

Order Deny,Allow

Deny from all

Options None

AllowOverride None

Order Allow,Deny

Allow from all

注意,因为我们设置Opitins None 和AllowOverride None,这将关闭服务器的所有Option和Override。你现在必须明确把每个目录设置成Option或者Override。

五、关闭目录浏览

你可以在Directory标签内用Option命令来实现这个功能。设置Option为None或者-Indexes。

Options -Indexes

六、关闭includes

这也可以通过在Directory标签内使用Option命令来实现。设置Option为None或者-Includes。

Options -Includes

七、关闭CGI执行程序

如果你不用CGI,那么请把它关闭。在目录标签中把选项设置成None或-ExecCGI就可以:

Options -ExecCGI

八、禁止Apache遵循符号链接

同上,把选项设置成None或-FollowSymLinks:

Options -FollowSymLinks

九、关闭多重选项

如果想关闭所有选项,很简单:

Options None

如果只想关系一些独立的选项,则通过将Options做如下设置可实现:

Options -ExecCGI -FollowSymLinks -Indexes

十、关闭对.htaccess文件的支持

在一个目录标签中实现:

AllowOverride None

如果需要重载,则保证这些文件不能够被下载,或者把文件名改成非.htaccess文件。比如,我们可以改成.httpdoverride文件,然后像下面这样阻止所有以.ht打头的文件:

AccessFileName .httpdoverride

Order allow,deny

Deny from all

Satisfy All

十一、运行mod_security

Run mod_security是O’Reilly出版社出版的Apache Security一书的作者,Ivan Ristic所写的一个非常好用的一个Apache模块。可以用它实现以下功能:

·简单过滤

·基于过滤的常规表达式

·URL编码验证

·Unicode编码验证

·审计

·空字节攻击防止

·上载存储限制

·服务器身份隐藏

·内置的Chroot支持

·更多其它功能

十二、关闭任何不必要的模块

Apache通常会安装几个模块,浏览Apache的module documentation,了解已安装的各个模块是做什么用的。很多情况下,你会发现并不需要激活那些模块。

找到httpd.conf中包含LoadModule的代码。要关闭这些模块,只需要在代码行前添加一个#号。要找到正在运行的模块,可以用以下语句:

grep LoadModule httpd.conf

以下模块通常被激活而并无大用:mod_imap, mod_include, mod_info, mod_userdir, mod_status, mod_cgi, mod_autoindex。

更多方法请见http://www.petefreitag.com/item/505.cfm

25个Apache性能优化技巧推荐

归类于Apache 参与评论

Apache至今仍处于web服务器领域的霸主,无人撼动,没有开发者不知道。本篇文章介绍25个Apache性能优化的技巧,如果你能理解并掌握,将让你的Apache性能有显著的提升!

Apache部分:

1. 移除不用的模块。

2. 使用 mod_disk_cache NOT mod_mem_cache 。

3. 扁平架构配置mod_disk_cache。

4. 安装恰当的Expires, Etag, 和 Cache-Control Headers 。

5. 将缓存放在独立的磁盘

6. 使用管道日志替代直接记录

7. 将日志放在不同的磁盘

8. 使用 mod_gzip/mod_deflate 。

9. 将HostnameLookups关闭.

10. 避免在configs中使用主机名。

11. 使用持久连接。

12. 不要设置KeepAliveTimeout太高。

13. 禁用.htaccess。

14. 允许symlinks。

15. 关闭ExtendedStatus。

16. 避免在DirectoryIndex中通配符。

OS 部分:

17. 提高Swappiness。

18. 提高写入缓冲器( Write Buffer)大小。

19. 提高最大打开文件。

应用部分:

20. 设置图像和样式表的前端代理。

21. 使用mod_passenger for rails。

22. 关闭safe_mode for php。

23. 不要使用threaded mpm with mod_php。

24. 刷新缓冲区预渲染。

25. 频繁访问的数据设置缓存。

更多细节见原文

译文出自:开源中国社区

使用 ApacheBench 進行網站的壓力測試

归类于Apache 参与评论

ApacheBench 工具程式是 Apache 網站伺服器軟體的一個附帶的工具軟體,專門用來執行網站伺服器的運行效能,特別是針對 Apache 網站伺服器 的效能分析。這支程式原本是用來檢測 Apache 網站伺服器(Web Server) 所能夠提供的效能,特別是可以看出 Apache 網站伺服器能提供每秒能送出多少網頁,當然的,也可以用在任何其他的網站伺服器,例如說:IISlighttpd

你可以到 Apache HTTP Server 網站下載最新版,如果你要在 Windows 的環境執行 ApacheBench 可以直接下載 Win32 Binary 的版本就好,由於線上所提供的版本是 MSI 的封裝檔,安裝好之後也等同於在你的電腦內安裝了一套 Apache HTTP Server,如果你不需要多執行一套 Apache HTTP Server 的話,你可以在安裝好之後進入 C:\Program Files\Apache Group\Apache2\bin 目錄,找到 ab.exe 執行檔,複製出來後再移除 Apache 安裝即可,因為 ab.exe 是可以獨立執行的,不需要任何關連的 dll 檔。

底下是 ab.exe 的使用參數摘要說明,若要看詳細說明可以看這裡(或中文翻譯):

C:\>ab -h  Usage: ab [options] [http://]hostname[:port]/path  Options are:      -n requests     Number of requests to perform      -c concurrency  Number of multiple requests to make      -t timelimit    Seconds to max. wait for responses      -p postfile     File containing data to POST      -T content-type Content-type header for POSTing      -v verbosity    How much troubleshooting info to print      -w              Print out results in HTML tables      -i              Use HEAD instead of GET      -x attributes   String to insert as table attributes      -y attributes   String to insert as tr attributes      -z attributes   String to insert as td or th attributes      -C attribute    Add cookie, eg. 'Apache=1234. (repeatable)      -H attribute    Add Arbitrary header line, eg. 'Accept-Encoding: gzip'                      Inserted after all normal header lines. (repeatable)      -A attribute    Add Basic WWW Authentication, the attributes                      are a colon separated username and password.      -P attribute    Add Basic Proxy Authentication, the attributes                      are a colon separated username and password.      -X proxy:port   Proxyserver and port number to use      -V              Print version number and exit      -k              Use HTTP KeepAlive feature      -d              Do not show percentiles served table.      -S              Do not show confidence estimators and warnings.      -g filename     Output collected data to gnuplot format file.      -e filename     Output CSV file with percentages served      -h              Display usage information (this message)

而我經常使用的參數摘要如下:

1. 同時 10 個連線,連續點擊 10000 次 ( 每個 Request 執行完畢後都會自動斷線,然後再重新連線 )

ab -n 10000 -c 10 http://www.example.com/index.aspx

2. 同時 10 個連線,連續點擊 10000 次,並且使用 Keep-Alive 方式連線(當 Web Server 有支援 Keep-Alive 功能時 ApacheBench 會在同一個連線下連續點擊該網頁)

ab -n 10000 -c 10 -k http://www.example.com/index.aspx

3. 將測試的效能原始資料匯出成 CSV 檔

ab -e output.csv -n 10000 -c 10 http://www.example.com/index.aspx

匯出的 output.csv 內容如下:

Percentage served,Time in ms  0,6.200000e+001  1,6.200000e+001  2,6.200000e+001  3,6.200000e+001  4,6.200000e+001  5,6.200000e+001  6,6.200000e+001  7,6.200000e+001  8,6.200000e+001  9,6.200000e+001  10,6.200000e+001  11,6.200000e+001  12,6.200000e+001  13,6.200000e+001  14,6.200000e+001  ......

上表所代表的每一列代表送出的百分比,第二個欄位是當下的 “Time per request” (每個要求所花費的時間),單位是豪秒(millisecond)。

如何有效的檢視結果

壓力測試的核心在於如何分析結果,底下我用一個測試的結果說明每個欄位所代表的意義。如果你只要看重點的話,可以看 Failed requests、Requests per second、與 Time per request 這三個參數也就差不多夠了。其中的 Failed requests 的數量太高的話,很有可能代表你的 Web Application 的穩定度不夠,而導致使用大量要求時無法回應需求 。而 Request per second 代表你每表可送出的回應數有多少,代表你 Web Application 的承載量有多少(在不考慮頻寬限制的情況下)。

C:\>ab -d -e a.csv -v 1 -n 1000 -c 3 http://www.example.com/index.aspx  This is ApacheBench, Version 2.0.41-dev <$Revision: 1.121.2.12 $> apache-2.0  Copyright (c) 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/  Copyright (c) 2006 The Apache Software Foundation, http://www.apache.org/    Benchmarking www.m-taoyuan.tw (be patient)  Completed 100 requests  Completed 200 requests  Completed 300 requests  Completed 400 requests  Completed 500 requests  Completed 600 requests  Completed 700 requests  Completed 800 requests  Completed 900 requests  Finished 1000 requests      Server Software:        Microsoft-IIS/6.0  Server Hostname:        www.m-taoyuan.tw  Server Port:            80    Document Path:          /index.aspx  Document Length:        25986 bytes    Concurrency Level:      3  Time taken for tests:   25.734375 seconds  Complete requests:      1000  Failed requests:        0  Write errors:           0  Total transferred:      26372000 bytes  HTML transferred:       25986000 bytes  Requests per second:    38.86 [#/sec] (mean)  Time per request:       77.203 [ms] (mean)  Time per request:       25.734 [ms] (mean, across all concurrent requests)  Transfer rate:          1000.72 [Kbytes/sec] received    Connection Times (ms)                min  mean[+/-sd] median   max  Connect:        0    1   4.4      0      15  Processing:    62   75   9.1     78     109  Waiting:       46   64   8.0     62     109  Total:         62   76   9.3     78     109

如上表顯示的結果來說明,我一個欄位一個欄位的講解如下:

  • Server Software:    Web主機的作業系統與版本(若Web主機設定關閉此資訊則無)
  • Server Hostname:  Web主機的IP位址(Hostname)
  • Server Port:           Web主機的連接埠(Port)
  • Document Path:     測試網址的路徑部分
  • Document Length: 測試網頁回應的網頁大小
  • Concurrency Level: 同時進行壓力測試的人數
  • Time taken for tests: 本次壓力測試所花費的總秒數
  • Complete requests: 完成的要求數(Requests)
  • Failed requests:      失敗的要求數(Requests)
  • Write errors:           寫入失敗的數量
  • Total transferred:   本次壓力測試的總數據傳輸量(包括 HTTP Header 的資料也計算在內)
  • HTML transferred:  本次壓力測試的總數據傳輸量(僅計算回傳的 HTML 的資料)
  • Requests per second: 平均每秒可回應多少要求
  • Time per request:  平均每個要求所花費的時間(單位: 豪秒)
  • Time per request:  平均每個要求所花費的時間,跨所有同時連線數的平均值(單位: 豪秒)
  • Transfer rate:         從 ab 到 Web Server 之間的網路傳輸速度

最後的 Connection Times (ms) 指的是壓力測試時的連線處理時間:

橫軸欄位的部分:

  • min:       最小值
  • mean:    平均值(正、負標準差)
  • median: 平均值(中間值)
  • max:      最大值

縱軸欄位的部分:

  • Connect:     從 ab 發出 TCP 要求到 Web 主機所花費的建立時間。
  • Processing:  從 TCP 連線建立後,直到 HTTP 回應(Response)的資料全部都收到所花的時間。
  • Waiting:       從發送 HTTP 要求完後,到 HTTP 回應(Response)第一個 Byte 所等待的時間。
  • Total:           等於 Connect + Processing 的時間(因為 Waiting 包含在 Processing 時間內了)

壓力測試的基本觀念

  • 排除頻寬的限制
    • 做壓力測試通常不會考量「頻寬的限制」,所以一般來說不會將測試的主機擺在遠端機房、然後測試程式擺在公司內部的主機,而是會將壓力測試的 Client 跟 Web 主機擺在同一個網段下進行壓力測試。
    • 因為「頻寬」只要花錢就會有了,但是主機的承載量卻是有限的,從遠端進行壓力測試主要的限制是在「頻寬」而非「效能」,所以從遠端單點進行壓力測試毫無任何意義可言,這樣是測不出主機的效能極限的。
    • 如果你有能力與資源進行大規模(多點)壓力測試的話,透過遠端進行壓力測試才有意義。
  • 壓力要循序漸進
    • 你不要一下字就執行同時連線數 100 人,而是要循序漸進的慢慢加同時連線數上去,才不會讓 Web Application 一下字承受過大的負載而導致效能的數據不正確(例如說 Failed requests 過高),但這只是建議,你也可以一下子操死你的主機,反正你在測主機的極限嘛!

參考網址:

原文地址:http://blog.miniasp.com/post/2008/06/Using-ApacheBench-ab-to-to-Web-stress-test.aspx

MySQL5相关版本 登录漏洞的测试脚本

归类于MySQL 参与评论

Security vulnerability in MySQL/MariaDB 在知道用户名的情况下(如root),直接反复重试(平均大约256次)即可登入。

受影响的版本:

All MariaDB and MySQL versions up to 5.1.61, 5.2.11, 5.3.5, 5.5.22 are vulnerable.
MariaDB versions from 5.1.62, 5.2.12, 5.3.6, 5.5.23 are not.
MySQL versions from 5.1.63, 5.5.24, 5.6.6 are not.

详情请点击这里

============== 补充说明 ==================

这个 Bug 在官方编译的版本中没有发现。如果你是下载的源码,然后自己编译的就有可能遇到这个问题。

这个问题和 memcmp() 这个函数的返回值有关系。目前知道的情况来看,gcc 自带的 memcmp 是安全的,BSD libc 的 memcmp 是安全的。Linux glibc sse 优化过的 memcmp 会有这个问题。

你可以使用这个脚本来测试你的 MySQL 是否存在此漏洞。

MySQL 的详细介绍:请点这里
MySQL 的下载地址:请点这里

文章转载自:开源中国社区 [http://www.oschina.net]

最近好累号好疲惫

归类于坏心情 | 生活实录 参与评论

最近好累好疲惫。
1.工作么,很忙,还有些业务不大了解,而且感觉记忆力明显下降。
2.生活上更是诸多不順,股票大亏,家里又逼婚,连学个車也跟教练有矛盾。
3.身体上么,严重缺乏煅练,健康日下。而且有些恶习难以控制。
4.晚上老是睡不好,总要瞄一眼,门有没有反锁好。
这日子过得太坑爹了。

将MSSQL中的表数据导出为SQL语句

归类于SQLServer 参与评论

将MSSQL中的表数据导出为SQL语句
Sql代码 复制代码 收藏代码
  1. drop proc proc_insert
  2. go
  3. create proc proc_insert (@tablename varchar(256))
  4. as
  5. begin
  6. set nocount on
  7. declare @sqlstr varchar(4000)
  8. declare @sqlstr1 varchar(4000)
  9. declare @sqlstr2 varchar(4000)
  10. select @sqlstr=’select ”insert into ’+@tablename
  11. select @sqlstr1=”
  12. select @sqlstr2=’ (‘
  13. select @sqlstr1= ’ values ( ”+’
  14. select @sqlstr1=@sqlstr1+col+’+”,”+’ ,@sqlstr2=@sqlstr2+name +’,' from (select case
  15. – when a.xtype =173 then ’case when ’+a.name+’ is null then ”NULL” else ’+'convert(varchar(‘+convert(varchar(4),a.length*2+2)+’),’+a.name +’)'+’ end’
  16. when a.xtype =127 then ’case when ’+a.name+’ is null then ”NULL” else ’+'convert(varchar(20),’+a.name +’)'+’ end’
  17. when a.xtype =104 then ’case when ’+a.name+’ is null then ”NULL” else ’+'convert(varchar(1),’+a.name +’)'+’ end’
  18. when a.xtype =175 then ’case when ’+a.name+’ is null then ”NULL” else ’+””””’+'+’replace(‘+a.name+’,””””,””””””)’ + ’+””””’+' end’
  19. when a.xtype =61 then ’case when ’+a.name+’ is null then ”NULL” else ’+””””’+'+’convert(varchar(23),’+a.name +’,121)’+ ’+””””’+' end’
  20. when a.xtype =106 then ’case when ’+a.name+’ is null then ”NULL” else ’+'convert(varchar(‘+convert(varchar(4),a.xprec+2)+’),’+a.name +’)'+’ end’
  21. when a.xtype =62 then ’case when ’+a.name+’ is null then ”NULL” else ’+'convert(varchar(23),’+a.name +’,2)’+' end’
  22. when a.xtype =56 then ’case when ’+a.name+’ is null then ”NULL” else ’+'convert(varchar(11),’+a.name +’)'+’ end’
  23. when a.xtype =60 then ’case when ’+a.name+’ is null then ”NULL” else ’+'convert(varchar(22),’+a.name +’)'+’ end’
  24. when a.xtype =239 then ’case when ’+a.name+’ is null then ”NULL” else ’+””””’+'+’replace(‘+a.name+’,””””,””””””)’ + ’+””””’+' end’
  25. when a.xtype =108 then ’case when ’+a.name+’ is null then ”NULL” else ’+'convert(varchar(‘+convert(varchar(4),a.xprec+2)+’),’+a.name +’)'+’ end’
  26. when a.xtype =231 then ’case when ’+a.name+’ is null then ”NULL” else ’+””””’+'+’replace(‘+a.name+’,””””,””””””)’ + ’+””””’+' end’
  27. when a.xtype =59 then ’case when ’+a.name+’ is null then ”NULL” else ’+'convert(varchar(23),’+a.name +’,2)’+' end’
  28. when a.xtype =58 then ’case when ’+a.name+’ is null then ”NULL” else ’+””””’+'+’convert(varchar(23),’+a.name +’,121)’+ ’+””””’+' end’
  29. when a.xtype =52 then ’case when ’+a.name+’ is null then ”NULL” else ’+'convert(varchar(12),’+a.name +’)'+’ end’
  30. when a.xtype =122 then ’case when ’+a.name+’ is null then ”NULL” else ’+'convert(varchar(22),’+a.name +’)'+’ end’
  31. when a.xtype =48 then ’case when ’+a.name+’ is null then ”NULL” else ’+'convert(varchar(6),’+a.name +’)'+’ end’
  32. – when a.xtype =165 then ’case when ’+a.name+’ is null then ”NULL” else ’+'convert(varchar(‘+convert(varchar(4),a.length*2+2)+’),’+a.name +’)'+’ end’
  33. when a.xtype =167 then ’case when ’+a.name+’ is null then ”NULL” else ’+””””’+'+’replace(‘+a.name+’,””””,””””””)’ + ’+””””’+' end’
  34. else ”’NULL”’
  35. end as col,a.colid,a.name
  36. from syscolumns a where a.id = object_id(@tablename) and a.xtype <>189 and a.xtype <>34 and a.xtype <>35 and a.xtype <>36
  37. )t order by colid
  38. select @sqlstr=@sqlstr+left(@sqlstr2,len(@sqlstr2)-1)+’) ’+left(@sqlstr1,len(@sqlstr1)-3)+’);” from ’+@tablename
  39. – print @sqlstr
  40. exec( @sqlstr)
  41. set nocount off
  42. end
  43. go
  44. select * from systypes
drop proc proc_insert
go
create proc proc_insert (@tablename varchar(256))
as
begin
set nocount on
declare @sqlstr varchar(4000)
declare @sqlstr1 varchar(4000)
declare @sqlstr2 varchar(4000)
select @sqlstr='select ''insert into '+@tablename
select @sqlstr1=''
select @sqlstr2=' ('
select @sqlstr1= ' values ( ''+'
select @sqlstr1=@sqlstr1+col+'+'',''+' ,@sqlstr2=@sqlstr2+name +',' from (select case 
-- when a.xtype =173 then 'case when '+a.name+' is null then ''NULL'' else '+'convert(varchar('+convert(varchar(4),a.length*2+2)+'),'+a.name +')'+' end'
when a.xtype =127 then 'case when '+a.name+' is null then ''NULL'' else '+'convert(varchar(20),'+a.name +')'+' end'
when a.xtype =104 then 'case when '+a.name+' is null then ''NULL'' else '+'convert(varchar(1),'+a.name +')'+' end'
when a.xtype =175 then 'case when '+a.name+' is null then ''NULL'' else '+'''''''''+'+'replace('+a.name+','''''''','''''''''''')' + '+'''''''''+' end'
when a.xtype =61 then 'case when '+a.name+' is null then ''NULL'' else '+'''''''''+'+'convert(varchar(23),'+a.name +',121)'+ '+'''''''''+' end'
when a.xtype =106 then 'case when '+a.name+' is null then ''NULL'' else '+'convert(varchar('+convert(varchar(4),a.xprec+2)+'),'+a.name +')'+' end'
when a.xtype =62 then 'case when '+a.name+' is null then ''NULL'' else '+'convert(varchar(23),'+a.name +',2)'+' end'
when a.xtype =56 then 'case when '+a.name+' is null then ''NULL'' else '+'convert(varchar(11),'+a.name +')'+' end'
when a.xtype =60 then 'case when '+a.name+' is null then ''NULL'' else '+'convert(varchar(22),'+a.name +')'+' end'
when a.xtype =239 then 'case when '+a.name+' is null then ''NULL'' else '+'''''''''+'+'replace('+a.name+','''''''','''''''''''')' + '+'''''''''+' end'
when a.xtype =108 then 'case when '+a.name+' is null then ''NULL'' else '+'convert(varchar('+convert(varchar(4),a.xprec+2)+'),'+a.name +')'+' end'
when a.xtype =231 then 'case when '+a.name+' is null then ''NULL'' else '+'''''''''+'+'replace('+a.name+','''''''','''''''''''')' + '+'''''''''+' end'
when a.xtype =59 then 'case when '+a.name+' is null then ''NULL'' else '+'convert(varchar(23),'+a.name +',2)'+' end'
when a.xtype =58 then 'case when '+a.name+' is null then ''NULL'' else '+'''''''''+'+'convert(varchar(23),'+a.name +',121)'+ '+'''''''''+' end'
when a.xtype =52 then 'case when '+a.name+' is null then ''NULL'' else '+'convert(varchar(12),'+a.name +')'+' end'
when a.xtype =122 then 'case when '+a.name+' is null then ''NULL'' else '+'convert(varchar(22),'+a.name +')'+' end'
when a.xtype =48 then 'case when '+a.name+' is null then ''NULL'' else '+'convert(varchar(6),'+a.name +')'+' end'
-- when a.xtype =165 then 'case when '+a.name+' is null then ''NULL'' else '+'convert(varchar('+convert(varchar(4),a.length*2+2)+'),'+a.name +')'+' end'
when a.xtype =167 then 'case when '+a.name+' is null then ''NULL'' else '+'''''''''+'+'replace('+a.name+','''''''','''''''''''')' + '+'''''''''+' end'
else '''NULL'''
end as col,a.colid,a.name
from syscolumns a where a.id = object_id(@tablename) and a.xtype <>189 and a.xtype <>34 and a.xtype <>35 and a.xtype <>36
)t order by colid

select @sqlstr=@sqlstr+left(@sqlstr2,len(@sqlstr2)-1)+') '+left(@sqlstr1,len(@sqlstr1)-3)+');'' from '+@tablename
-- print @sqlstr
exec( @sqlstr)
set nocount off
end
go

select * from systypes

使用方法:

exec proc_insert 你的表名

.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中使用多线程来增强用户体验

,

收Google Adsence西联汇款指南(农业银行篇)

归类于GoogleAdsence 参与评论

收Google Adsence西联汇款指南(农业银行篇)
在你的账户里查到google发出的西联汇款监控号后,第二天就可以到农业银行取款了。去的时候

记得带好身份证和监控号(建议把那个页面打印出来,里面有付款人地址的,方便你填写)。
问农行服务台的保安哥哥拿2份单子,一份是《西联汇款收汇单》,一份是《涉外收入申报单》

。填写的时候千万看清楚,收汇单里的姓名要用拼音写,名和姓不要填错了。具体如下:

一、《西联汇款收汇单》

收汇人:
名:wu kong
姓:sun
地址:House110 Lane110 Beijing Road Shanghai China
电话号码:021 110

发汇人:
名:Google Inc.
姓:(空着,什么也不要写)
地址:1600 Amphitheatre Parkway Mountain View,CA94043 USA
电话号码:(空着,什么也不要写)
收汇金额:USD$110
汇款的发汇地:USA
汇款监控号码:0008621110
身份验证问题、答案:(空着,什么也不要写)
签名:孙悟空
(全部完成,记得上面的英文和数字要写在格子里哦,不然会给银行MM笑的)

二、《涉外收入申报单》

(我在这里只列出需要填写的项目,其他的都空着不要填,这个单子用中文填写就可以了)
收款人名称:孙悟空
个人身份证号码:31011019800808110X
收入款币种及金额:USD$110
付款人名称:Google Inc.
填报人签章:孙悟空
填报人电话:021110
收款人章:孙悟空
(全部完成,仔细检查一遍后去拿号排队,记得是拿“外汇业务”,而不是“个人业务”。“外汇业务”

办的人很少,基本不用排队。)

把2份填好的单子和你的身份证交给银行MM,记得更她讲:帮我收到以后直接转存1年期的现汇(

一定要存现汇哦,千万不要拿现钞,否则损失很多汇率的)。银行MM看看单子,哇,这个哥哥好专业哦,

一个也没填错,全对!她一定会瞪着水汪汪的大眼睛对你刮目相看的,呵呵。。。MM在检查单子后,会跟

西联汇款中国分公司取得联系,进行信息核对。验明正身后,扫描并复印你的身份证(国家外汇管理局的

要求,没办法,真是烦琐啊)。以上手续完毕后,你的整个收汇过程就完成了。

然后MM会给你一张定期存款的开户单,你可以选择要存单或者一本通(强烈建议选择一本通,农

行的一本通是本外币通用的,当然是免费的,以后用起来很方便,也不容易丢)。填上姓名、地址、身份

证号码、存期、是否约转等信息后,签上你的大名,交给MM,就完成了(这个太简单啦,地球人都知道,

不做详细说明了,如果你连这个也不会,那就别存了,把你的美金送给MM得了,哈哈)。

剩下的工作MM会帮你全部搞定的。整个收汇和转存的过程大概30分钟左右(如果你老是填错单子

的话,那可能就不止了。因此建议早上早点去,免得晚了人家要吃饭或者下班,单子来不及做进去)。全

部完成后拿回身份证、一本通、收汇单和申报单(客户联)后,记得谢谢MM哦。Over…

,

apache禁止使用IP访问的实现方法(防止恶意绑定实践版)

归类于Apache 参与评论

apache禁止使用IP访问的实现方法(防止恶意绑定实践版)

网络上查到的解决方法

用apache搭建的WEB服务器,如何让网友只能通过设定的域名访问,而不能直接通过服务器的IP地址访问呢,有两个方法可以实现(仅限于我知道的,当然肯定还会有其他方法可以实现),都是修改httpd.conf文件来实现的,下面举例说明。

方法一:在httpd.conf文件最后面,加入以下代码(完全按照这个也不好用)

NameVirtualHost 221.*.*.*
<VirtualHost 221.*.*.*>
ServerName 221.*.*.*
<Location />
Order Allow,Deny
Deny from all
</Location>
</VirtualHost>

<VirtualHost 221.*.*.*>
DocumentRoot “c:/web”
ServerName www.webjx.com
</VirtualHost>

说明:蓝色部分是实现拒绝直接通过221.*.*.*这个IP的任何访问请求,这时如果你用221.*.*.*访问,会提示拒绝访问。红色部分就是允许通过www.webjx.com这个域名访问,主目录指向c:/web(这里假设你的网站的根目录是c:/web)

方法二:在httpd.conf文件最后面,加入以下代码(完全按照此处不是很好用哦)

     NameVirtualHost 221.*.*.*
<VirtualHost 221.*.*.*>
DocumentRoot “c:/test”
ServerName 221.*.*.*
</VirtualHost> 

     <VirtualHost 221.*.*.*>
DocumentRoot “c:/web”
ServerName www.webjx.com
</VirtualHost>

说明:蓝色部分是把通过221.*.*.*这个IP直接访问的请求指向c:/test目录下,这可以是个空目录,也可以在里面建一个首页文件,如index.hmtl,首面文件内容可以是一个声明,说明不能通过IP直接访问。红色部分的意思跟方法一是一样的。

注:修改后要重启apache

——————————————————————————

经实践得到的切实可行的解决方法:

NameVirtualHost 2.2.2.2:80

<VirtualHost 2.2.2.2:80>
    ServerName 2.2.2.2
    <Location />
    Order Allow,Deny
    Deny from all
    </Location>
</VirtualHost>

<VirtualHost 2.2.2.2:80>
ServerAdmin xxx@126.com
DocumentRoot “D:/ApacheServer/WebApps/xxx”
ServerName www.xxx.com
ServerAlias www.xxx.com xxx.com w.xxx.com ww.xxx.com

<Directory “D:/ApacheServer/WebApps/paitol/ROOT”>
    AllowOverride All
    Order allow,deny
    Allow from all
    Options -Indexes
    </Directory>

ErrorLog “logs/dummy-host2.xx-error.log”
CustomLog “logs/dummy-host2.xx-access.log” common
ErrorDocument 404 http://www.xxx.com/404.jsp
JkMount /*.servlet ajp13_w
JkMount /*.jsp ajp13_w
JkMount /*.do ajp13_w
</VirtualHost>

红色这段是为了防止直接输入IP访问。绿色这段是指定绑定的目录权限,可防止其他域名访问此目录。

修改后,得以防止恶意IP绑定。^-^^-^^-^^-^^-^

顶部