爱情
(1)
安装
(2)
北斗
(1)
毕业
(1)
变量
(1)
测绘局
(1)
测量
(2)
插件
(1)
查询
(1)
常用
(1)
成果转化
(1)
词汇
(1)
慈善
(1)
答辩
(2)
代码
(2)
电台
(1)
发泄
(1)
感悟
(4)
高程
(1)
搞笑
(5)
共产党
(1)
古诗词
(1)
管理
(1)
函数
(3)
绘图
(1)
加密
(1)
交际
(1)
教程
(4)
教育
(2)
解决
(4)
解密
(1)
精度
(1)
酒桌
(2)
开源
(2)
科技
(1)
科学
(1)
刻录
(1)
老外
(1)
励志
(5)
连续剧
(1)
恋爱
(1)
列表
(1)
领导
(1)
美食
(2)
名人
(3)
命令
(4)
区别
(1)
日记
(2)
软件
(12)
商业
(3)
时政
(1)
视频
(1)
数据
(1)
算法
(1)
投影
(2)
图论
(1)
网络
(1)
网站
(1)
卫星
(3)
未成年
(1)
慰问
(1)
文本
(1)
文件
(2)
下载
(4)
笑话
(2)
学习
(9)
遥感
(1)
疑问
(5)
营销
(1)
娱乐
(3)
源代码
(2)
政策
(1)
指导
(3)
智慧
(5)
主成分分析
(2)
抓图
(1)
专家
(1)
资料
(5)
字符串
(1)
最短路径
(1)
坐标
(1)
baidu
(3)
Bernese
(1)
blog
(2)
c#
(9)
China
(3)
Dijkstra
(1)
DNS
(1)
doris
(1)
dos
(1)
excel
(1)
firefox
(3)
GAMIT
(8)
gcc
(1)
GIS
(3)
GMT
(1)
GPS
(5)
ITRF
(1)
linux
(5)
mapx
(1)
matlab
(6)
movie
(4)
music
(3)
oracle
(2)
pic
(1)
PPT
(3)
PROJ.4
(2)
python
(2)
QQ
(2)
rinex
(1)
shell
(2)
sql
(1)
teqc
(3)
tools
(1)
tps
(1)
ubuntu
(5)
USA
(1)
website
(1)
博客归档
2015年10月4日星期日
C#编程总结(七)数据加密——附源码
http://www.cnblogs.com/yank/p/3528548.html
C#编程总结(七)数据加密——附源码
概述
数据加密的基本过程就是对原来为明文的文件或数据按某种算法进行处理,使其成为不可读的一段代码,通常称为“密文”,使其只能在输入相应的密钥之后才能显示出本来内容,通过这样的途径来达到保护数据不被非法人窃取、阅读的目的。 该过程的逆过程为解密,即将该编码信息转化为其原来数据的过程。加密建立在对信息进行数学编码和解码的基础上。加密类型分为两种,对称加密与非对称加密,对称加密双方采用共同密钥。非对称加密,这种加密方式存在两个密钥,一个是公共密钥(对外公开),一种是私人密钥(对外保密)。
一、摘要算法
数据摘要算法是密码学算法中非常重要的一个分支,它通过对所有数据提取指纹信息以实现数据签名、数据完整性校验等功能,由于其不可逆性,有时候会被用做敏感信息的加密。数据摘要算法也被称为哈希(Hash)算法或散列算法。
从严格意义上讲,摘要算法不是加密算法,但在具体应用中类似于加密算法使用,或者与加密算法一起使用,这里也拿来介绍下。
应用范围:密码加密、数据完整性校验、数字签名等
这里介绍常用的两种摘要算法,MD5与SHA1。
提示:当前MD5已经被破解,推荐使用SHA1
1、MD5
哈希函数将任意长度的二进制字符串映射为固定长度的小型二进制字符串。 加密哈希函数有这样一个属性:在计算上不大可能找到散列为相同的值的两个不同的输入;也就是说,两组数据的哈希值仅在对应的数据也匹配时才会匹配。 数据的少量更改会在哈希值中产生不可预知的大量更改。MD5 算法的哈希值大小为 128 位。
MD5 类的 ComputeHash 方法将哈希作为 16 字节的数组返回。 请注意,某些 MD5 实现会生成 32 字符的十六进制格式哈希。 若要与此类实现进行互操作,请将 ComputeHash 方法的返回值格式化为十六进制值。
MD5加密:
复制代码
///
/// MD5加密为32字符长度的16进制字符串
///
///
///
public static string EncryptByMD5(string input)
{
MD5 md5Hasher = MD5.Create();
byte[] data = md5Hasher.ComputeHash(Encoding.UTF8.GetBytes(input));
StringBuilder sBuilder = new StringBuilder();
//将每个字节转为16进制
for (int i = 0; i < data.Length; i++)
{
sBuilder.Append(data[i].ToString("x2"));
}
return sBuilder.ToString();
}
复制代码
2、SHA1
计算输入数据的 SHA1 哈希值。
哈希值用作表示大量数据的固定大小的唯一值。 如果相应的数据也匹配,则两个数据集的哈希应该匹配。 数据的少量更改会在哈希值中产生不可预知的大量更改。
SHA1 算法的哈希值大小为 160 位。
SHA1加密:
复制代码
///
/// SHA1加密
///
///
///
public static string EncryptBySHA1(string input)
{
SHA1 sha = new SHA1CryptoServiceProvider();
byte[] bytes = Encoding.Unicode.GetBytes(input);
byte[] result = sha.ComputeHash(bytes);
return BitConverter.ToString(result);
}
复制代码
二、对称加密
对称加密(也叫私钥加密)指加密和解密使用相同密钥的加密算法。有时又叫传统密码算法,就是加密密钥能够从解密密钥中推算出来,同时解密密钥也可以从加密密钥中推算出来。而在大多数的对称算法中,加密密钥和解密密钥是相同的,所以也称这种加密算法为秘密密钥算法或单密钥算法。
原理图:
优点:算法公开、计算量小、加密速度快、加密效率高。
缺点:密钥管理困难,使用成本较高。与公开密钥加密算法比起来,对称加密算法能够提供加密和认证却缺乏了签名功能,使得使用范围有所缩小。
常用的对称加密算法有:DES、IDEA、RC2、RC4、SKIPJACK、RC5、AES算法等
应用场景:数据传输、大数据量加密、敏感数据加密等等
这里重点介绍常用的DES与AES加密算法。
提示: DES已经被破解,推荐使用3DES或AES
1、DES
最早、最著名的保密密钥或对称密钥加密算法DES(Data Encryption Standard)是由IBM公司在70年代发展起来的,并经政府的加密标准筛选后,于1976年11月被美国政府采用,DES随后被美国国家标准局和美国国家标准协会(American National Standard Institute,ANSI)承认。
DES使用56位密钥对64位的数据块进行加密,并对64位的数据块进行16轮编码。与每轮编码时,一个48位的"每轮"密钥值由56位的完整密钥得出来。DES用软件进行解码需用很长时间,而用硬件解码速度非常快。幸运的是,当时大多数黑客并没有足够的设备制造出这种硬件设备。在1977年,人们估计要耗资两千万美元才能建成一个专门计算机用于DES的解密,而且需要12个小时的破解才能得到结果。当时DES被认为是一种十分强大的加密方法。
随着计算机硬件的速度越来越快,制造一台这样特殊的机器的花费已经降到了十万美元左右,而用它来保护十亿美元的银行,那显然是不够保险了。另一方面,如果只用它来保护一台普通服务器,那么DES确实是一种好的办法,因为黑客绝不会仅仅为入侵一个服务器而花那么多的钱破解DES密文。
但是,这个算法,现在已经能够轻易破解。不过对于日常的非机密文件同样可以继续使用。
加密:
复制代码
///
/// 加密字符串
///
///
///
///
public static string EncryptString(string input, string sKey)
{
byte[] data = Encoding.UTF8.GetBytes(input);
using (DESCryptoServiceProvider des = new DESCryptoServiceProvider())
{
des.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
des.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
ICryptoTransform desencrypt = des.CreateEncryptor();
byte[] result = desencrypt.TransformFinalBlock(data, 0, data.Length);
return BitConverter.ToString(result);
}
}
复制代码
解密:
复制代码
///
/// 解密字符串
///
///
///
///
public static string DecryptString(string input, string sKey)
{
string[] sInput = input.Split("-".ToCharArray());
byte[] data = new byte[sInput.Length];
for (int i = 0; i < sInput.Length; i++)
{
data[i] = byte.Parse(sInput[i], NumberStyles.HexNumber);
}
using (DESCryptoServiceProvider des = new DESCryptoServiceProvider())
{
des.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
des.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
ICryptoTransform desencrypt = des.CreateDecryptor();
byte[] result = desencrypt.TransformFinalBlock(data, 0, data.Length);
return Encoding.UTF8.GetString(result);
}
}
复制代码
2、AES
表示高级加密标准 (AES) 的所有实现都必须从中继承的抽象基类。
密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。
加密:
复制代码
///
/// AES加密算法
///
/// 明文字符串
/// 密钥
/// 字符串
public static string EncryptByAES(string input, string key)
{
byte[] keyBytes = Encoding.UTF8.GetBytes(key.Substring(0, 32));
using (AesCryptoServiceProvider aesAlg = new AesCryptoServiceProvider())
{
aesAlg.Key = keyBytes;
aesAlg.IV = AES_IV;
ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);
using (MemoryStream msEncrypt = new MemoryStream())
{
using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
{
using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
{
swEncrypt.Write(input);
}
byte[] bytes = msEncrypt.ToArray();
//return Convert.ToBase64String(bytes);//此方法不可用
return BitConverter.ToString(bytes);
}
}
}
}
复制代码
解密:
复制代码
///
/// AES解密
///
/// 密文字节数组
/// 密钥
/// 返回解密后的字符串
public static string DecryptByAES(string input, string key)
{
//byte[] inputBytes = Convert.FromBase64String(input); //Encoding.UTF8.GetBytes(input);
string[] sInput = input.Split("-".ToCharArray());
byte[] inputBytes = new byte[sInput.Length];
for (int i = 0; i < sInput.Length; i++)
{
inputBytes[i] = byte.Parse(sInput[i], NumberStyles.HexNumber);
}
byte[] keyBytes = Encoding.UTF8.GetBytes(key.Substring(0, 32));
using (AesCryptoServiceProvider aesAlg = new AesCryptoServiceProvider())
{
aesAlg.Key = keyBytes;
aesAlg.IV = AES_IV;
ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);
using (MemoryStream msEncrypt = new MemoryStream(inputBytes))
{
using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, decryptor, CryptoStreamMode.Read))
{
using (StreamReader srEncrypt = new StreamReader(csEncrypt))
{
return srEncrypt.ReadToEnd();
}
}
}
}
}
复制代码
三、非对称加密算法
概念:
非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。 非对称加密算法实现机密信息交换的基本过程是:甲方生成一对密钥并将其中的一把作为公用密钥向其它方公开;得到该公用密钥的乙方使用该密钥对机密信息进行加密后再发送给甲方;甲方再用自己保存的另一把专用密钥对加密后的信息进行解密。另一方面,甲方可以使用乙方的公钥对机密信息进行签名后再发送给乙方;乙方再用自己的私匙对数据进行验签。甲方只能用其专用密钥解密由其公用密钥加密后的任何信息。 非对称加密算法的保密性比较好,它消除了最终用户交换密钥的需要。
原理图:
场景1:发送者用接收者的公钥加密,接受者用自己的私钥解密,具体如下图
场景2:发送者用自己的私钥加密,接收者用发送者公布的公钥解密,具体如下图
场景3:数字签名中应用,这里暂不进行介绍,后续有相关文章进行详细介绍。
见:http://www.cnblogs.com/yank/p/3533998.html
优点:非对称加密体系不要求通信双方事先传递密钥或有任何约定就能完成保密通信,并且密钥管理方便,可实现防止假冒和抵赖,因此,更适合网络通信中的保密通信要求
主要算法:RSA、Elgamal、背包算法、Rabin、D-H、ECC(椭圆曲线加密算法)。
1、RSA
RSA(Rivest-Shamir-Adleman)算法是基于大数不可能被质因数分解假设的公钥体系。简单地说就是找两个很大的质数。一个对外公开的为"公钥"(Public key) ,另一个不告诉任何人,称为"私钥"(Private key)。这两个密钥是互补的,也就是说用公钥加密的密文可以用私钥解密,反过来也一样。
假设用户甲要寄信给用户乙,他们互相知道对方的公钥。甲就用乙的公钥加密邮件寄出,乙收到后就可以用自己的私钥解密出甲的原文。由于别人不知道乙的私钥,所以即使是甲本人也无法解密那封信,这就解决了信件保密的问题。另一方面,由于每个人都知道乙的公钥,他们都可以给乙发信,那么乙怎么确信是不是甲的来信呢?那就要用到基于加密技术的数字签名了。
甲用自己的私钥将签名内容加密,附加在邮件后,再用乙的公钥将整个邮件加密(注意这里的次序,如果先加密再签名的话,别人可以将签名去掉后签上自己的签名,从而篡改了签名)。这样这份密文被乙收到以后,乙用自己的私钥将邮件解密,得到甲的原文和数字签名,然后用甲的公钥解密签名,这样一来就可以确保两方面的安全了。
加密:
复制代码
///
/// RSA加密
///
/// 明文
/// 公钥
/// 密文字符串
public static string EncryptByRSA(string plaintext, string publicKey)
{
UnicodeEncoding ByteConverter = new UnicodeEncoding();
byte[] dataToEncrypt = ByteConverter.GetBytes(plaintext);
using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider())
{
RSA.FromXmlString(publicKey);
byte[] encryptedData = RSA.Encrypt(dataToEncrypt, false);
return Convert.ToBase64String(encryptedData);
}
}
复制代码
解密:
复制代码
///
/// RSA解密
///
/// 密文
/// 私钥
/// 明文字符串
public static string DecryptByRSA(string ciphertext, string privateKey)
{
UnicodeEncoding byteConverter = new UnicodeEncoding();
using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider())
{
RSA.FromXmlString(privateKey);
byte[] encryptedData = Convert.FromBase64String(ciphertext);
byte[] decryptedData = RSA.Decrypt(encryptedData, false);
return byteConverter.GetString(decryptedData);
}
}
复制代码
所有案例,见测试DEMO
源码地址:http://files.cnblogs.com/yank/EncriptSample.zip
2010年12月23日星期四
c#中字符串操作函数
函数 语法 功能
Len Len(string|varname) 返回字符串内字符的数目,或是存储一变量所需的字节数。
Trim Trim(string) 将字符串前后的空格去掉
Ltrim Ltrim(string) 将字符串前面的空格去掉
Rtrim Rtrim(string) 将字符串后面的空格去掉
Mid Mid(string,start,length) 从string字符串的start字符开始取得length长度的字符串,如果省略第三个参数表示从start字符开始到字符串结尾的字符串
Left Left(string,length) 从string字符串的左边取得length长度的字符串
Right Right(string,length) 从string字符串的右边取得length长度的字符串
LCase LCase(string) 将string字符串里的所有大写字母转化为小写字母
UCase UCase(string) 将string字符串里的所有大写字母转化为大写字母
StrComp StrComp(string1,string2[,compare]) 返回string1字符串与string2字符串的比较结果,如果两个字符串相同,则返回0,如果小于则返回-1,如果大于则返回1
InStr InStr(string1,string2[, compare]) 返回string1字符串在string2字符串中第一次出现的位置
Split Split(string1,delimiter[, count[, start]]) 将字符串根据delimiter拆分成一维数组,其中delimiter用于标识子字符串界限。如果省略,使用空格("")作为分隔符。
count 返回的子字符串数目,-1 指示返回所有子字符串。
start为 1 执行文本比较;如果为 0 或者省略执行二进制比较。
Replace Replace(expr ession, find, replacewith[, compare[, count[, start]]]) 返回字符串,其中指定数目的某子字符串(find)被替换为另一个子字符串(replacewith)。
1、Len函数示例:
下面的示例利用 Len 函数返回字符串中的字符数目:
Dim MyString
MyString = Len("VBSCRIPT") ''MyString 包含 8。
2、Trim、Ltrim、Rtrim函数示例:
下面的示例利用 LTrim, RTrim, 和 Trim 函数分别用来除去字符串开始的空格、尾部空格、 开始和尾部空格:
Dim MyVar
MyVar = LTrim(" vbscript ") ''MyVar 包含 "vbscript "。
MyVar = RTrim(" vbscript ") ''MyVar 包含 " vbscript"。
MyVar = Trim(" vbscript ") ''MyVar 包含"vbscript"。
3、Mid函数示例:
下面的示例利用 Mid 函数返回字符串中从第四个字符开始的六个字符:
Dim MyVar
MyVar = Mid("VB脚本is fun!", 4, 6) ''MyVar 包含 "Script"。
4、Left函数示例:
下面的示例利用Left 函数返回MyString 的左边三个字母:
Dim MyString, LeftString
MyString = "VBSCript"
LeftString = Left(MyString, 3) ''LeftString 包含 "VBS
5、Right函数示例:
下面的示例利用 Right 函数从字符串右边返回指定数目的字符:
Dim AnyString, MyStr
AnyString = "Hello World" ''定义字符串。
MyStr = Right(AnyString, 1) ''返回 "d"。
MyStr = Right(AnyString, 6) '' 返回 " World"。
MyStr = Right(AnyString, 20) '' 返回 "Hello World"。
6、LCase函数示例:
下面的示例利用 LCase 函数把大写字母转换为小写字母:
Dim MyString
Dim LCaseString
MyString = "VBSCript"
LCaseString = LCase(MyString) '' LCaseString 包含 "vbscript"。
7、 UCase函数示例:
下面的示例利用 UCase 函数返回字符串的大写形式:
Dim MyWord
MyWord = UCase("Hello World") '' 返回"HELLO WORLD"。
8、StrComp函数示例:
下面的示例利用 StrComp 函数返回字符串比较的结果。如果第三个参数为 1 执行文本比较;如果第三个参数为 0 或者省略执行二进制比较。
Dim MyStr1, MyStr2, MyComp
MyStr1 = "ABCD": MyStr2 = "abcd" ''定义变量。
MyComp = StrComp(MyStr1, MyStr2, 1) '' 返回 0。
MyComp = StrComp(MyStr1, MyStr2, 0) '' 返回 -1。
MyComp = StrComp(MyStr2, MyStr1) '' 返回 1。
9、InStr示例:
下面的示例利用 InStr 搜索字符串:
Dim SearchString, SearchChar, MyPos
SearchString ="XXpXXpXXPXXP"???
SearchChar = "P"??
MyPos = Instr(SearchString, SearchChar)???''返回 9.
注意:返回的不是一个字符串在另一个字符串中第一次出现的字符位置,而是字节位置。
10、Split函数示例:
Dim MyString, MyArray, Msg
MyString = "VBScriptXisXfun!"
MyArray = Split(MyString, "x",-1,1)
'' MyArray(0) contains "VBScript".
'' MyArray(1) contains "is".
'' MyArray(2) contains "fun!".
Response.Write(MyArray(0))
11、Replace函数示例:
Replace("ABCD", "BC", "12") ''得到A12D
Ucase(string) 将字符串转换为大写。
Val(string) 将代表数字的字符串转换为数值型态,若字符串中含有非数字的内容则会将其去除后,合并为一数字。
Weekday(date) 取的参数中的日期是一个星期的第几天,星期天为1、星期一为2、星期二为3 依此类推。
WeekDayName(number) 依接收的参数取得星期的名称,可接收的参数为1 到7,星期天为1、星期一为2、星期二为3 依此类推。
Split(expr ession[, delimiter]) 以delimiter 参数设定的条件字符串来将字符串分割为字符串数组。
Sqrt(number) 取得一数值得平方根。
Str(number) 将数字转为字符串后传回。
StrReverse(expr ession) 取得字符串内容反转后的结果。
Tan(number) 取得某个角度的正切值。
TimeOfDay() 取得目前不包含日期的时间。
Timer() 取得由0:00 到目前时间的秒数,型态为Double。
TimeSerial(hour, minute, second) 将接收的参数合并为一个只有时间Date 型态的数据。
Timavalue(time) 取得符合国别设定样式的时间值。
Today() 取得今天不包含时间的日期。
Trim(string) 去掉字符串开头和结尾的空白。
TypeName(varname) 取得变量或对象的型态。
Ubound(arrayname[, dimension]) 取得数组的最终索引值,dimension 参数是指定取得第几维度的最终索引值。
MonthName(month) 依接收的月份数值取得该月份的完整写法。
Now() 取得目前的日期和时间。
Oct(number) 将数值参数转换为8 进制值。
Replace(expr ession, find, replace) 将字符串中find 参数指定的字符串转换为replace 参数指定的字符串。
Right(string,length) 由字符串右边开始取得length 参数设定长度的字符。
RmDir(path) 移除一个空的目录。
Rnd() 取得介于0 到1 之间的小数,如果每次都要取得不同的值,使用前需加上Randomize 叙述。
Rtrim(string) 去掉字符串的右边空白部分。
Second(time) 取得时间内容的秒部分,型态为Integer。
Sign(number) 取得数值内容是正数或负数,正数传回1,负数传回-1,0 传回0。
Sin(number) 取得一个角度的正弦值。
Space(number) 取得number 参数设定的空白字符串。
IsDate(expr ession) 判断表达式内容是否为DateTime 型态,若是则传回True,反之则为False。
IsDbNull(expr ession) 判断表达式内容是否为Null,若是则传回True,反之则为False。
IsNumeric(expr ession) 判断表达式内容是否为数值型态,若是则传回True,反之则为False。
Join(sourcearray[, delimiter]) 将字符串数组合并唯一个字符串,delimiter 参数是设定在各个元素间加入新的字符串。
Lcase(string) 将字符串转换为小写字体。
Left(string, length) 由字符串左边开始取得length 参数设定长度的字符。
Len(string) 取得字符串的长度。
Log(number) 取得数值的自然对数。
Ltrim(string) 去掉字符串的左边空白部分。
Mid(string, start[, length]) 取出字符串中strat 参数设定的字符后length 长度的字符串,若length 参数没有设定,则取回start 以后全部的字符。
Minute(time) 取得时间内容的分部分,型态为Integer。
MkDir(path) 建立一个新的目录。
Month(date) 取得日期的月部分,型态为Integer。
FormatDateTime(date[,namedformat]) 传回格式化的日期或时间数据。
FormatNumber(expr ession[,numdigitsafterdecimal [,includeleadingdigit]]) 传回格式化
的数值数据。Numdigitsafterdecimal 参数为小数字数,includeleadingdigit 参数为当整数为0 时是否补至整数字数。
FormatPercent(expr ession[,numdigitsafterdecimal [,includeleadingdigit]]) 传回转换为百分比格式的数值数据。numdigitsafterdecimal 参数为小数字数,includeleadingdigit 参数为当整数为0 时是否补至整数字数。
GetAttr(filename) 传回档案或目录的属性值。
Hex(number) 将数值参数转换为16 进制值。
Hour(time) 传回时间的小时字段,型态是Integer。
Iif(expr ession, truepart, falsepart) 当表达式的传回值为True 时执行truepart 字段的程序,反之则执行falsepart 字段。
InStr([start, ]string1, string2) 搜寻string2 参数设定的字符出现在字符串的第几个字符,start 为由第几个字符开始寻找,string1 为欲搜寻的字符串,string2 为欲搜寻的字符。
Int(number) 传回小于或等于接收参数的最大整数值。
IsArray(varname) 判断一个变量是否为数组型态,若为数组则传回True,反之则为False。
Day(datetime) 依接收的日期参数传回日。
Eof(filenumber) 当抵达一个被开启的档案结尾时会传回True。
Exp(number) 依接收的参数传回e 的次方值。
FileDateTime(pathname) 传回档案建立时的日期、时间。
FileLen(pathname) 传回档案的长度,单位是Byte。
Filter(sourcearray, match[, include[, compare]]) 搜寻字符串数组中的指定字符串,凡是数组元素中含有指定字符串,会将它们结合成新的字符串数组并传回。若是要传回不含指定字符串的数组元素,则 include 参数设为False。compare 参数则是设定搜寻时是否区分大小写,此时只要给TextCompare 常数或1 即可。
Fix(number) 去掉参数的小数部分并传回。
Format(expr ession[, style[, firstdayofweek[, firstweekofyear]]]) 将日期、时间和数值资料转为每个国家都可以接受的格式。
FormatCurrency(expr ession[,numdigitsafterdecimal [,includeleadingdigit]]) 将数值输出为金额型态。
numdigitsafterdecimal 参数为小数字数,includeleadingdigit 参数为当整数为0 时是否补至整数字数。
CObj(expr ession) 转换表达式为Object 型态。
CShort(expr ession) 转换表达式为Short 型态。
CSng(expr ession) 转换表达式为Single 型态。
CStr(expr ession) 转换表达式为String 型态。
Choose (index, choice-1[, choice-2, ... [, choice-n]]) 以索引值来选择并传回所设定的参数。
Chr(charcode) 以ASCII 码来取得字符内容。
Close(filenumberlist) 结束使用Open 开启的档案。
Cos(number) 取得一个角度的余弦值。
Ctype(expr ession, typename) 转换表达式的型态。
DateAdd(dateinterval, number, datetime) 对日期或时间作加减。
DateDiff(dateinterval, date1, date2) 计算两个日期或时间间的差值。
DatePart (dateinterval, date) 依接收的日期或时间参数传回年、月、日或时间。
DateSerial(year, month, day) 将接收的参数合并为一个只有日期的Date 型态的数据。
Datevalue(datetime) 取得符合国别设定样式的日期值,并包含时间。
Abs(number) 取得数值的绝对值。
Asc(String) 取得字符串表达式的第一个字符ASCII 码。
Atn(number) 取得一个角度的反正切值。
CallByName (object, procname, usecalltype,[args()]) 执行一个对象的方法、设定或传回对象的属性。
CBool(expr ession) 转换表达式为Boolean 型态。
CByte(expr ession) 转换表达式为Byte 型态。
CChar(expr ession) 转换表达式为字符型态。
CDate(expr ession) 转换表达式为Date 型态。
CDbl(expr ession) 转换表达式为Double 型态。
CDec(expr ession) 转换表达式为Decimal 型态。
CInt(expr ession) 转换表达式为Integer 型态。
CLng(expr ession) 转换表达式为Long 型态
测绘取位函数
static public double GetNumber(double xIn,int decimalNumber)
{
//该函数主要实现数值的测绘进位问题
//xIn:读入的数值
//decimalNumber:保留的小数位数
//返回值:双精度
//by zzh_my@163.com
//language c#
//creat at 2010-12
//last modify at 2010-12
int a = decimalNumber;//保留的小数个数
string xStr = xIn.ToString();
string xStrOut = "";
//获取xStr长度lAll,
int lAll = xStr.Length;
//(3)小数点位置lDot,
int lDot = xStr.IndexOf(".");
//未找到小数点则返回-1
if (lDot > 0)
{
//1、则小数部分长度lLit=lAll-lDot
int lLit = lAll - lDot - 1;
//2、如果lLit=a,则原样输出
if (lLit == a)
{
xStrOut = xStr;
}
//3、如果lLit
if (lLit < a)
{
xStrOut = xStr.PadRight(lDot + a + 1, '0');
}
//4、如果lLit>a,则考虑
if (lLit > a)
{
//小数点后第a+1位 a_1Deal
int a_1Deal = lDot + a + 1;
//一、如果char[a_1Deal]>5,则char[lDot+a]+1;
if (Convert.ToInt16(xStr.Substring(a_1Deal, 1)) > 5)
{
xStrOut = xStr.Substring(0, lDot + a) + Convert.ToString(Convert.ToInt16(xStr.Substring(a_1Deal - 1, 1)) + 1);
}
//二、如果char[a_1Deal]<5,则截断xStr至小数点后a位
if (Convert.ToInt16(xStr.Substring(a_1Deal, 1)) < 5)
{
xStrOut = xStr.Substring(0, a_1Deal);
}
//三、如果char[a_1Deal]==5,则
if (Convert.ToInt16(xStr.Substring(a_1Deal, 1)) == 5)
{
// //(一)、如果第小数后第a-1位,为偶数,则同 二
if (Convert.ToInt16(xStr.Substring(a_1Deal - 1, 1)) % 2 == 0)
{
xStrOut = xStr.Substring(0, a_1Deal);
}
// (二)、如果第小数后第a-1位,为奇数,则同 一
if (Convert.ToInt16(xStr.Substring(a_1Deal - 1, 1)) % 2 != 0)
{
xStrOut = xStr.Substring(0, lDot + a) + Convert.ToString(Convert.ToInt16(xStr.Substring(a_1Deal - 1, 1)) + 1);
}
}
}
}
else
{
xStr = xStr + ".";
xStrOut = xStr.PadRight(lAll + 1 + a, '0');
}
return Convert.ToDouble(xStrOut);
}
{
//该函数主要实现数值的测绘进位问题
//xIn:读入的数值
//decimalNumber:保留的小数位数
//返回值:双精度
//by zzh_my@163.com
//language c#
//creat at 2010-12
//last modify at 2010-12
int a = decimalNumber;//保留的小数个数
string xStr = xIn.ToString();
string xStrOut = "";
//获取xStr长度lAll,
int lAll = xStr.Length;
//(3)小数点位置lDot,
int lDot = xStr.IndexOf(".");
//未找到小数点则返回-1
if (lDot > 0)
{
//1、则小数部分长度lLit=lAll-lDot
int lLit = lAll - lDot - 1;
//2、如果lLit=a,则原样输出
if (lLit == a)
{
xStrOut = xStr;
}
//3、如果lLit
if (lLit < a)
{
xStrOut = xStr.PadRight(lDot + a + 1, '0');
}
//4、如果lLit>a,则考虑
if (lLit > a)
{
//小数点后第a+1位 a_1Deal
int a_1Deal = lDot + a + 1;
//一、如果char[a_1Deal]>5,则char[lDot+a]+1;
if (Convert.ToInt16(xStr.Substring(a_1Deal, 1)) > 5)
{
xStrOut = xStr.Substring(0, lDot + a) + Convert.ToString(Convert.ToInt16(xStr.Substring(a_1Deal - 1, 1)) + 1);
}
//二、如果char[a_1Deal]<5,则截断xStr至小数点后a位
if (Convert.ToInt16(xStr.Substring(a_1Deal, 1)) < 5)
{
xStrOut = xStr.Substring(0, a_1Deal);
}
//三、如果char[a_1Deal]==5,则
if (Convert.ToInt16(xStr.Substring(a_1Deal, 1)) == 5)
{
// //(一)、如果第小数后第a-1位,为偶数,则同 二
if (Convert.ToInt16(xStr.Substring(a_1Deal - 1, 1)) % 2 == 0)
{
xStrOut = xStr.Substring(0, a_1Deal);
}
// (二)、如果第小数后第a-1位,为奇数,则同 一
if (Convert.ToInt16(xStr.Substring(a_1Deal - 1, 1)) % 2 != 0)
{
xStrOut = xStr.Substring(0, lDot + a) + Convert.ToString(Convert.ToInt16(xStr.Substring(a_1Deal - 1, 1)) + 1);
}
}
}
}
else
{
xStr = xStr + ".";
xStrOut = xStr.PadRight(lAll + 1 + a, '0');
}
return Convert.ToDouble(xStrOut);
}
2010年5月9日星期日
c# 后台调用dos程序
c# 后台调用dos程序
后台调用就是运行某个程序而不被人发现,而这里讲的程序是dos这种简单的,需要在dos窗口中输入参数才能运行的程序。
采用c#的System.Diagnostics类
代码讲解如下:
Process myProcess=new Process(); 实例化线程
myProcess.StartInfo.FileName = "cmd.exe"; 线程上的准备要打开的程序名
myProcess.StartInfo.WorkingDirectory = "D:\\work"; 该线程的工作目录
myProcess.StartInfo.UseShellExecute = false; 没搞懂
myProcess.StartInfo.RedirectStandardError = true; 重定向错误输出,该效果是实现后台的关键之一
myProcess.StartInfo.RedirectStandardInput = true; 同上
myProcess.StartInfo.RedirectStandardOutput = true; 同上
myProcess.StartInfo.CreateNoWindow = true; 不显示窗口,没有使用myProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; 这个该何时用没搞清
myProcess.Start(); 启动线程
string strCmd = "ping 192.9.200.193"; 后台要在dos中执行的命令
myProcess.StandardInput.WriteLine(strCmd); //ping 192.9.200.193 输入命令并执行
myProcess.StandardInput.WriteLine("exit"); 退出dos窗口
string str = myProcess.StandardOutput.ReadToEnd();获得dos后台dos窗口的输出
myProcess.Close(); 结束该线程
后台调用就是运行某个程序而不被人发现,而这里讲的程序是dos这种简单的,需要在dos窗口中输入参数才能运行的程序。
采用c#的System.Diagnostics类
代码讲解如下:
Process myProcess=new Process(); 实例化线程
myProcess.StartInfo.FileName = "cmd.exe"; 线程上的准备要打开的程序名
myProcess.StartInfo.WorkingDirectory = "D:\\work"; 该线程的工作目录
myProcess.StartInfo.UseShellExecute = false; 没搞懂
myProcess.StartInfo.RedirectStandardError = true; 重定向错误输出,该效果是实现后台的关键之一
myProcess.StartInfo.RedirectStandardInput = true; 同上
myProcess.StartInfo.RedirectStandardOutput = true; 同上
myProcess.StartInfo.CreateNoWindow = true; 不显示窗口,没有使用myProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; 这个该何时用没搞清
myProcess.Start(); 启动线程
string strCmd = "ping 192.9.200.193"; 后台要在dos中执行的命令
myProcess.StandardInput.WriteLine(strCmd); //ping 192.9.200.193 输入命令并执行
myProcess.StandardInput.WriteLine("exit"); 退出dos窗口
string str = myProcess.StandardOutput.ReadToEnd();获得dos后台dos窗口的输出
myProcess.Close(); 结束该线程
c# 后台调用teqc
使用c# 窗体程序 并建立了一个按钮控件
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 System.Diagnostics;
using System.Threading;
namespace TestExeWin1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
// try
{
Process myProcess=new Process();
myProcess.StartInfo.FileName = "cmd.exe";
myProcess.StartInfo.WorkingDirectory = "D:\\work";
myProcess.StartInfo.UseShellExecute = false;
myProcess.StartInfo.RedirectStandardError = true;
myProcess.StartInfo.RedirectStandardInput = true;
myProcess.StartInfo.RedirectStandardOutput = true;
myProcess.StartInfo.CreateNoWindow = true;
// myProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
myProcess.Start();
myProcess.StandardInput.WriteLine("teqc +qc wuhn0070.10o"); //ping 192.9.200.193
myProcess.StandardInput.WriteLine("exit");
// myProcess.CloseMainWindow();
string str = myProcess.StandardOutput.ReadToEnd();
MessageBox.Show(str);
// myProcess.StartInfo.UseShellExecute = false;
// myProcess = Process.Start("cmd.exe");
// myProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
//myProcess.StartInfo.CreateNoWindow = true;
// Display physical memory usage 5 times at intervals of 2 seconds.
for (int i = 0; i < 5; i++)
{
if (!myProcess.HasExited)
{
// Discard cached information about the process.
myProcess.Refresh();
// Print working set to console.
// Console.WriteLine("Physical Memory Usage: "
// + myProcess.WorkingSet.ToString());
MessageBox.Show("Physical Memory Usage: "
+ myProcess.WorkingSet.ToString());
// Wait 2 seconds.
Thread.Sleep(2000);
}
else
{
break;
}
}
// Close process by sending a close message to its main window.
// myProcess.CloseMainWindow();
// Free resources associated with process.
myProcess.Close();
}
// catch //(Exception e)
{
//Console.WriteLine("The following exception was raised: ");
// Console.WriteLine(e.Message);
// MessageBox.Show("The following exception was raised: ");
}
}
}
}
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 System.Diagnostics;
using System.Threading;
namespace TestExeWin1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
// try
{
Process myProcess=new Process();
myProcess.StartInfo.FileName = "cmd.exe";
myProcess.StartInfo.WorkingDirectory = "D:\\work";
myProcess.StartInfo.UseShellExecute = false;
myProcess.StartInfo.RedirectStandardError = true;
myProcess.StartInfo.RedirectStandardInput = true;
myProcess.StartInfo.RedirectStandardOutput = true;
myProcess.StartInfo.CreateNoWindow = true;
// myProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
myProcess.Start();
myProcess.StandardInput.WriteLine("teqc +qc wuhn0070.10o"); //ping 192.9.200.193
myProcess.StandardInput.WriteLine("exit");
// myProcess.CloseMainWindow();
string str = myProcess.StandardOutput.ReadToEnd();
MessageBox.Show(str);
// myProcess.StartInfo.UseShellExecute = false;
// myProcess = Process.Start("cmd.exe");
// myProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
//myProcess.StartInfo.CreateNoWindow = true;
// Display physical memory usage 5 times at intervals of 2 seconds.
for (int i = 0; i < 5; i++)
{
if (!myProcess.HasExited)
{
// Discard cached information about the process.
myProcess.Refresh();
// Print working set to console.
// Console.WriteLine("Physical Memory Usage: "
// + myProcess.WorkingSet.ToString());
MessageBox.Show("Physical Memory Usage: "
+ myProcess.WorkingSet.ToString());
// Wait 2 seconds.
Thread.Sleep(2000);
}
else
{
break;
}
}
// Close process by sending a close message to its main window.
// myProcess.CloseMainWindow();
// Free resources associated with process.
myProcess.Close();
}
// catch //(Exception e)
{
//Console.WriteLine("The following exception was raised: ");
// Console.WriteLine(e.Message);
// MessageBox.Show("The following exception was raised: ");
}
}
}
}
C# 后台调用cmd exe 程序
以前在玩Windows 98的时候,几台电脑连起来,需要测试网络连接是否正常,经常用的一个命令就是Ping.exe。感觉相当实用。
总结,这里就是为了说明一个问题,不但是Ping命令,只要是命令行程序或者是Dos内部命令,我们都可以用上面的方式来执行它,并获取相应的结果,并且 这些程序的执行过程不会显示出来,如果需要调用外部程序就可以嵌入到其中使用了。
现在 .net为我们提供了强大的功能来调用外部工具,并通过重定向输入、输出获取执行结果,下面就用一个例子来说明调用Ping.exe命令实现网络的检测, 希望对.net初学者有所帮助。
首先,我们用使用Process类,来创建独立的进程,导入System.Diagnostics,
using System.Diagnostics;
实例一个Process类,启动一个独立进程
Process p = new Process();
Process类有一个StartInfo属性,这个是ProcessStartInfo类,包括了一些属性和方法,
下面我们用到了他的几个属性:
设定程序名
p.StartInfo.FileName = "cmd.exe";
关闭Shell的使用
p.StartInfo.UseShellExecute = false;
重定向标准输入
p.StartInfo.RedirectStandardInput = true;
重定向标准输出
p.StartInfo.RedirectStandardOutput = true;
重定向错误输出
p.StartInfo.RedirectStandardError = true;
设置不显示窗口
p.StartInfo.CreateNoWindow = true;
上面几个属性的设置是比较关键的一步。
既然都设置好了那就启动进程吧,
p.Start();
输入要执行的命令,这里就是ping了,
p.StandardInput.WriteLine("ping -n 1 192.192.132.229");
p.StandardInput.WriteLine("exit");
从输出流获取命令执行结果,
string strRst = p.StandardOutput.ReadToEnd();
在本机测试得到如下结果:
"Microsoft Windows 2000 [Version 5.00.2195]\r\n(C) 版权所有 1985-2000 Microsoft Corp.\r\n\r\nD:\\himuraz\\csharpproject\\ZZ\\ConsoleTest\\bin\\Debug>ping -n 1 192.192.132.231\r\n\r\r\nPinging 192.192.132.231 with 32 bytes of data:\r\r\n\r\r\nReply from 192.192.132.231: bytes=32 time<10ms ttl="128\r\r\n\r\r\nPing" sent =" 1," received =" 1," lost =" 0" minimum =" 0ms," maximum =" 0ms," average =" 0ms\r\r\n\r\nD:\\himuraz\\csharpproject\\ZZ\\ConsoleTest\\bin\\Debug">exit\r\n"
有了输出结果,那还有什么好说的,分析strRst字符串就可以知道网络的连接情况了。
下面是一个完整的程序,当然对Ping.exe程序执行的结果不全,读者可以进一步修改
完整代码如下:
using System;
using System.Diagnostics;
namespace ZZ
{
class ZZConsole
{
[STAThread]
static void Main(string[] args)
{
string ip = "192.192.132.229";
string strRst = CmdPing(ip);
Console.WriteLine(strRst);
Console.ReadLine();
}
private static string CmdPing(string strIp)
{
Process p = new Process();
p.StartInfo.FileName = "cmd.exe";
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.CreateNoWindow = true;
string pingrst;
p.Start();
p.StandardInput.WriteLine("ping -n 1 "+strIp);
p.StandardInput.WriteLine("exit");
string strRst = p.StandardOutput.ReadToEnd();
if(strRst.IndexOf("(0% loss)")!=-1)
pingrst = "连接";
else if( strRst.IndexOf("Destination host unreachable.")!=-1)
pingrst = "无法到达目的主机";
else if(strRst.IndexOf("Request timed out.")!=-1)
pingrst = "超时";
else if(strRst.IndexOf("Unknown host")!=-1)
pingrst = "无法解析主机";
else
pingrst = strRst;
p.Close();
return pingrst;
}
}
}
总结,这里就是为了说明一个问题,不但是Ping命令,只要是命令行程序或者是Dos内部命令,我们都可以用上面的方式来执行它,并获取相应的结果,并且 这些程序的执行过程不会显示出来,如果需要调用外部程序就可以嵌入到其中使用了。
注:
在以上命令中.FileName可以用要执行的命令直接替换 而不见得要运行了cmd.exe后再往命令行中写入要执行的命令,这样,就不会出现开始时的cmd.exe启动时的Microsoft Windows [版本 5.2.3790]
(C) 版权所有 1985-2003 Microsoft Corp.
(C) 版权所有 1985-2003 Microsoft Corp.
之类的提示了,而这个FileName并不一定需要扩展名,也不必要是exe文件,系统会自动寻找适合的程序将其打 开。
那么FileName需要参数时怎么办呢?可以在p.StartInfo.Arguments中合并写入。然后再 p.Start()即可。
当然,用cmd.exe启动的方式在某些情况下也是有用的
http://hi.baidu.com/shichaoyang251/blog/item/ee437e5473519b193b2935f7.html
http://hi.baidu.com/shichaoyang251/blog/item/ee437e5473519b193b2935f7.html
2010年5月8日星期六
启动notepad,10钟后结束
启动一个Notepad例程,然后每2秒取内存,时间运行最长10秒,10秒之后,查看Notepad进程是否已经结束,如果没有,则结束notepad.
using System;
using System.Diagnostics;
using System.Threading;
namespace Process_Sample
{
class MyProcessClass
{
public static void Main()
{
try
{
Process myProcess;
myProcess = Process.Start("Notepad.exe");
// Display physical memory usage 5 times at intervals of 2 seconds.
for (int i = 0;i < 5; i++)
{
if (!myProcess.HasExited)
{
// Discard cached information about the process.
myProcess.Refresh();
// Print working set to console.
Console.WriteLine("Physical Memory Usage: "
+ myProcess.WorkingSet.ToString());
// Wait 2 seconds.
Thread.Sleep(2000);
}
else {
break;
}
}
// Close process by sending a close message to its main window.
myProcess.CloseMainWindow();
// Free resources associated with process.
myProcess.Close();
}
catch(Exception e)
{
Console.WriteLine("The following exception was raised: ");
Console.WriteLine(e.Message);
}
}
}
}
"vs_setup.msi 未能打开"的解决方案
http://blog.zxlm.cn/2007/12/vs_setupmsi-%E6%9C%AA%E8%83%BD%E6%89%93%E5%BC%80%E7%9A%84%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88.html"vs_setup.msi 未能打开"的解决方案
以下方法经本人测试有效。
Visual Studio2005修复安装、卸载时报错vs_setup.msi 未能打开,安装程序将不再继续。
估计原因是Visual Studio2005的配置信息受损。使用Windows Installer CleanUp Utility清除Visual Studio2005在注册表中保存的相关配置信息重新安装即可。
重新安装好Visual Studio2005后,你就可以正常地使用,或者卸载Visual Studio2005。
2010年5月7日星期五
c# 调用exe
http://zhidao.baidu.com/question/57228449.html
写的太复杂了
第一步:建立对象
第2步:启用多线程调用!
回答者: 新大软院 - 四级 2008-6-17 21:39
using System.Diagnostics;
如果是dos
Process.Start("cmd.exe");
如果是其他文件
Process.Start("绝对路径+文件名.exe");
------------------------------------
如何在c#中调用外部dos程序?
使用Process对象:
System.Diagnostics.Process p=new System.Diagnostics.Process();
p.StartInfo.FileName="arj.exe" ;//需要启动的程序名
p.StartInfo.Arguments="-x sourceFile.Arj c:\temp";//启动参数
p.Start();//启动
if(p.HasExisted)//判断是否运行结束
p.kill();
-------------------------------------------------------------------------------------------------------------------------------------
///
/// 启动其他的应用程序
///
/// 应用程序名称
/// 应用程序工作目录
/// 命令行参数
/// 窗口风格
public static bool StartProcess(string file,string workdirectory,string args,ProcessWindowStyle style)
{
try
{
Process myprocess = new Process();
ProcessStartInfo startInfo = new ProcessStartInfo(file,args);
startInfo.WindowStyle = style;
startInfo.WorkingDirectory = workdirectory;
myprocess.StartInfo = startInfo;
myprocess.StartInfo.UseShellExecute = false;
myprocess.Start();
return true;
}
catch(Exception e0)
{
MessageBox.Show("启动应用程序时出错!原因:" + e0.Message);
}
return false;
}
string parms = "" + GlobalObject.GetInstance().UserID + " " + GlobalObject.GetInstance().UserPassword;
if (PublicMethods.StartProcess(Application.StartupPath + @"\uptool\uptool.exe",Application.StartupPath + "\\UpTool",parms,ProcessWindowStyle.Normal))
{
Environment.Exit(0);
}
----------------------------------------------------------------------------------------------------------------------
Process.Start("IExplore.exe", "http://community.csdn.net/Expert/topic/4021/4021327.xml?temp=.9493524");
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo( );
startInfo.FileName = "执行EXE的文件名";
startInfo.Arguments = "参数数组";
System.Diagnostics.Process.Start( startInfo );
----------------------------------------------------------------------------------------------------------------------------
1.有好多时,我们需要调用外部的EXE程序,并且要等它运行完毕,我们才可以继续下面的动作,那我们怎样去实现了,请看以下代码.
'怎样等待外部程序运行完毕.
'从系统资料夹读入文件
Dim sysFolder As String = _
Environment.GetFoldERPath(Environment.SpecialFolder.System)
'创建一个新的进程结构
Dim pInfo As New ProcessStartInfo()
'设置其成员FileName为系统资料的Eula.txt
pInfo.FileName = sysFolder & "\eula.txt"
'运行该文件
Dim p As Process = Process.Start(pInfo)
'等待程序装载完成
p.WaitForInputIdle()
'等待进行程退出
p.WaitForExit()
'继续执行下面的代码
MessageBox.Show("继续执行代码")
2.我们想在5秒钟后,强行关闭它.而不是需要我手工关闭.
'设置退出时间
Dim timeOut As Integer = 5000
Dim sysFolder As String = _
Environment.GetFolderPath(Environment.SpecialFolder.System)
Dim pInfo As New ProcessStartInfo()
pInfo.FileName = sysFolder & "\eula.txt"
Dim p As Process = Process.Start(pInfo)
p.WaitForInputIdle()
p.WaitForExit(timeOut)
'检查是否在超时前已关闭了.
If p.HasExited = False Then
'进行程还在运行
'看进程有没有回应
If p.Responding Then
p.CloseMainWindow() '关闭窗口
Else
p.Kill() '强行中断
End If
End If
MessageBox.Show("继续执行代码")
复杂?! 他要用的代码就在里面,如果你自己看了,绝对能写出来自己。你提问题只是想要代码还是想学习啊?
写的太复杂了
第一步:建立对象
第2步:启用多线程调用!
回答者: 新大软院 - 四级 2008-6-17 21:39
using System.Diagnostics;
如果是dos
Process.Start("cmd.exe");
如果是其他文件
Process.Start("绝对路径+文件名.exe");
------------------------------------
如何在c#中调用外部dos程序?
使用Process对象:
System.Diagnostics.Process p=new System.Diagnostics.Process();
p.StartInfo.FileName="arj.exe" ;//需要启动的程序名
p.StartInfo.Arguments="-x sourceFile.Arj c:\temp";//启动参数
p.Start();//启动
if(p.HasExisted)//判断是否运行结束
p.kill();
-------------------------------------------------------------------------------------------------------------------------------------
///
/// 启动其他的应用程序
///
/// 应用程序名称
/// 应用程序工作目录
/// 命令行参数
/// 窗口风格
public static bool StartProcess(string file,string workdirectory,string args,ProcessWindowStyle style)
{
try
{
Process myprocess = new Process();
ProcessStartInfo startInfo = new ProcessStartInfo(file,args);
startInfo.WindowStyle = style;
startInfo.WorkingDirectory = workdirectory;
myprocess.StartInfo = startInfo;
myprocess.StartInfo.UseShellExecute = false;
myprocess.Start();
return true;
}
catch(Exception e0)
{
MessageBox.Show("启动应用程序时出错!原因:" + e0.Message);
}
return false;
}
string parms = "" + GlobalObject.GetInstance().UserID + " " + GlobalObject.GetInstance().UserPassword;
if (PublicMethods.StartProcess(Application.StartupPath + @"\uptool\uptool.exe",Application.StartupPath + "\\UpTool",parms,ProcessWindowStyle.Normal))
{
Environment.Exit(0);
}
----------------------------------------------------------------------------------------------------------------------
Process.Start("IExplore.exe", "http://community.csdn.net/Expert/topic/4021/4021327.xml?temp=.9493524");
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo( );
startInfo.FileName = "执行EXE的文件名";
startInfo.Arguments = "参数数组";
System.Diagnostics.Process.Start( startInfo );
----------------------------------------------------------------------------------------------------------------------------
1.有好多时,我们需要调用外部的EXE程序,并且要等它运行完毕,我们才可以继续下面的动作,那我们怎样去实现了,请看以下代码.
'怎样等待外部程序运行完毕.
'从系统资料夹读入文件
Dim sysFolder As String = _
Environment.GetFoldERPath(Environment.SpecialFolder.System)
'创建一个新的进程结构
Dim pInfo As New ProcessStartInfo()
'设置其成员FileName为系统资料的Eula.txt
pInfo.FileName = sysFolder & "\eula.txt"
'运行该文件
Dim p As Process = Process.Start(pInfo)
'等待程序装载完成
p.WaitForInputIdle()
'等待进行程退出
p.WaitForExit()
'继续执行下面的代码
MessageBox.Show("继续执行代码")
2.我们想在5秒钟后,强行关闭它.而不是需要我手工关闭.
'设置退出时间
Dim timeOut As Integer = 5000
Dim sysFolder As String = _
Environment.GetFolderPath(Environment.SpecialFolder.System)
Dim pInfo As New ProcessStartInfo()
pInfo.FileName = sysFolder & "\eula.txt"
Dim p As Process = Process.Start(pInfo)
p.WaitForInputIdle()
p.WaitForExit(timeOut)
'检查是否在超时前已关闭了.
If p.HasExited = False Then
'进行程还在运行
'看进程有没有回应
If p.Responding Then
p.CloseMainWindow() '关闭窗口
Else
p.Kill() '强行中断
End If
End If
MessageBox.Show("继续执行代码")
复杂?! 他要用的代码就在里面,如果你自己看了,绝对能写出来自己。你提问题只是想要代码还是想学习啊?
订阅:
博文 (Atom)