﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>博客园-今日红缨在手</title><link>http://www.cnblogs.com/dajianshi/</link><description /><language>zh-cn</language><lastBuildDate>Sun, 05 Jul 2009 19:45:24 GMT</lastBuildDate><pubDate>Sun, 05 Jul 2009 19:45:24 GMT</pubDate><ttl>60</ttl><item><title>.Net3.5中调用gzip压缩遇到的问题</title><link>http://www.cnblogs.com/dajianshi/archive/2008/03/18/1111180.html</link><dc:creator>大剑师</dc:creator><author>大剑师</author><pubDate>Tue, 18 Mar 2008 03:17:00 GMT</pubDate><guid>http://www.cnblogs.com/dajianshi/archive/2008/03/18/1111180.html</guid><wfw:comment>http://www.cnblogs.com/dajianshi/comments/1111180.html</wfw:comment><comments>http://www.cnblogs.com/dajianshi/archive/2008/03/18/1111180.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cnblogs.com/dajianshi/comments/commentRss/1111180.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/dajianshi/services/trackbacks/1111180.html</trackback:ping><description><![CDATA[日前，使用framework中的gzip进行数据压缩解压缩，遇到两个问题，着实费了些力气才找大，拿出来晒晒<br />
问题一：解压后数据少两个byte？！<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">[]&nbsp;Compress(</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;s)<br />
<img id="Codehighlighter1_42_413_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_42_413_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_42_413_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_42_413_Closed_Text').style.display='inline';" alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_42_413_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_42_413_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_42_413_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_42_413_Open_Text').style.display='inline';" alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_42_413_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_42_413_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">[]&nbsp;buf&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;System.Text.Encoding.UTF8.GetBytes(s);<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MemoryStream&nbsp;ms&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;MemoryStream();<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">[]&nbsp;rb;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GZipStream&nbsp;gzip&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;GZipStream(ms,&nbsp;CompressionMode.Compress,&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">);<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gzip.Write(buf,&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">,&nbsp;buf.Length);<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gzip.Flush();<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ms.Position&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rb&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">[ms.Length];<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ms.Read(rb,&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">,&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">)ms.Length);<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; gzip.Close();<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ms.Close();<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;rb;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
上面这段是一开始我使用的代码，基本正常，可是解压后总是短两个byte。<br />
后来改为下面的代码，问题解决<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Code_Closed_Image_110241" onclick="this.style.display='none'; Code_Closed_Text_110241.style.display='none'; Code_Open_Image_110241.style.display='inline'; Code_Open_Text_110241.style.display='inline';" height="16" alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" align="top"><img id="Code_Open_Image_110241" style="display: none" onclick="this.style.display='none'; Code_Open_Text_110241.style.display='none'; Code_Closed_Image_110241.style.display='inline'; Code_Closed_Text_110241.style.display='inline';" height="16" alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top"><span id="Code_Closed_Text_110241" style="border-right: #808080 1px solid; border-top: #808080 1px solid; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">正确的代码</span><span id="Code_Open_Text_110241" style="display: none"><br />
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">[]&nbsp;Compress(</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;s)<br />
<img id="Codehighlighter1_42_412_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_42_412_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_42_412_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_42_412_Closed_Text').style.display='inline';" alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_42_412_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_42_412_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_42_412_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_42_412_Open_Text').style.display='inline';" alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_42_412_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_42_412_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">[]&nbsp;buf&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;System.Text.Encoding.UTF8.GetBytes(s);<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MemoryStream&nbsp;ms&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;MemoryStream();<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">[]&nbsp;rb;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GZipStream&nbsp;gzip&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;GZipStream(ms,&nbsp;CompressionMode.Compress,&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">);<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gzip.Write(buf,&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">,&nbsp;buf.Length);<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gzip.Flush();<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gzip.Close();<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ms.Position&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rb&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">[ms.Length];<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ms.Read(rb,&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">,&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">)ms.Length);<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ms.Close();<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;rb;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></span></div>
你发现了问题所在吗，对，就是读取之前需要先关闭GZipStream，从网上看到别人用Using，我试了试，也是不行的！<br />
问题二：解压缩没有例外抛出，也不能读出数据！？<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Code_Closed_Image_110859" onclick="this.style.display='none'; Code_Closed_Text_110859.style.display='none'; Code_Open_Image_110859.style.display='inline'; Code_Open_Text_110859.style.display='inline';" height="16" alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" align="top"><img id="Code_Open_Image_110859" style="display: none" onclick="this.style.display='none'; Code_Open_Text_110859.style.display='none'; Code_Closed_Image_110859.style.display='inline'; Code_Closed_Text_110859.style.display='inline';" height="16" alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top"><span id="Code_Closed_Text_110859" style="border-right: #808080 1px solid; border-top: #808080 1px solid; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">有问题的解压代码</span><span id="Code_Open_Text_110859" style="display: none"><br />
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;Decompress(</span><span style="color: #0000ff">byte</span><span style="color: #000000">[]&nbsp;buf)<br />
<img id="Codehighlighter1_46_598_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_46_598_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_46_598_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_46_598_Closed_Text').style.display='inline';" alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_46_598_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_46_598_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_46_598_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_46_598_Open_Text').style.display='inline';" alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_46_598_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_46_598_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;totalLength&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;size&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MemoryStream&nbsp;ms&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;MemoryStream(),&nbsp;msD&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;MemoryStream();<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ms.Write(buf,&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">,&nbsp;buf.Length);<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ms.Seek(</span><span style="color: #800080">0</span><span style="color: #000000">,&nbsp;SeekOrigin.Begin);<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GZipStream&nbsp;zip;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zip&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;GZipStream(ms,&nbsp;CompressionMode.Decompress);<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">[]&nbsp;db;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">true</span><span style="color: #000000">)<br />
<img id="Codehighlighter1_332_488_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_332_488_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_332_488_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_332_488_Closed_Text').style.display='inline';" alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_332_488_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_332_488_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_332_488_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_332_488_Open_Text').style.display='inline';" alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_332_488_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_332_488_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;zip.ReadByte();<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(size&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #800080">1</span><span style="color: #000000">)<br />
<img id="Codehighlighter1_385_450_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_385_450_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_385_450_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_385_450_Closed_Text').style.display='inline';" alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_385_450_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_385_450_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_385_450_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_385_450_Open_Text').style.display='inline';" alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_385_450_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_385_450_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;totalLength</span><span style="color: #000000">++</span><span style="color: #000000">;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;msD.WriteByte((</span><span style="color: #0000ff">byte</span><span style="color: #000000">)size);<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000"><br />
<img id="Codehighlighter1_464_483_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_464_483_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_464_483_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_464_483_Closed_Text').style.display='inline';" alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_464_483_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_464_483_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_464_483_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_464_483_Open_Text').style.display='inline';" alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_464_483_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_464_483_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">break</span><span style="color: #000000">;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zip.Close();<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;db&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;msD.ToArray();<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;msD.Close();<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;System.Text.Encoding.UTF8.GetString(db);<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></span></div>
上面代码，无论我怎么执行调试，都不能正确解压，参数就是压缩函数的返回值！可是，意外发现如果调试在读取解压数据之前多停留一段时间，就可以读出数据！<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Code_Closed_Image_110941" onclick="this.style.display='none'; Code_Closed_Text_110941.style.display='none'; Code_Open_Image_110941.style.display='inline'; Code_Open_Text_110941.style.display='inline';" height="16" alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" align="top"><img id="Code_Open_Image_110941" style="display: none" onclick="this.style.display='none'; Code_Open_Text_110941.style.display='none'; Code_Closed_Image_110941.style.display='inline'; Code_Closed_Text_110941.style.display='inline';" height="16" alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top"><span id="Code_Closed_Text_110941" style="border-right: #808080 1px solid; border-top: #808080 1px solid; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">正确执行的解压代码<br />
</span><span id="Code_Open_Text_110941" style="display: none"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;Decompress(</span><span style="color: #0000ff">byte</span><span style="color: #000000">[]&nbsp;buf)<br />
<img id="Codehighlighter1_46_661_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_46_661_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_46_661_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_46_661_Closed_Text').style.display='inline';" alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_46_661_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_46_661_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_46_661_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_46_661_Open_Text').style.display='inline';" alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_46_661_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_46_661_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;totalLength&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;size&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MemoryStream&nbsp;ms&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;MemoryStream(),&nbsp;msD&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;MemoryStream();<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ms.Write(buf,&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">,&nbsp;buf.Length);<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ms.Seek(</span><span style="color: #800080">0</span><span style="color: #000000">,&nbsp;SeekOrigin.Begin);<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GZipStream&nbsp;zip;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zip&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;GZipStream(ms,&nbsp;CompressionMode.Decompress);<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">[]&nbsp;db;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;readed&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">true</span><span style="color: #000000">)<br />
<img id="Codehighlighter1_356_551_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_356_551_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_356_551_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_356_551_Closed_Text').style.display='inline';" alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_356_551_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_356_551_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_356_551_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_356_551_Open_Text').style.display='inline';" alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_356_551_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_356_551_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;zip.ReadByte();<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(size&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #800080">1</span><span style="color: #000000">)<br />
<img id="Codehighlighter1_409_501_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_409_501_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_409_501_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_409_501_Closed_Text').style.display='inline';" alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_409_501_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_409_501_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_409_501_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_409_501_Open_Text').style.display='inline';" alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_409_501_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_409_501_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">!</span><span style="color: #000000">readed)&nbsp;readed&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;totalLength</span><span style="color: #000000">++</span><span style="color: #000000">;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;msD.WriteByte((</span><span style="color: #0000ff">byte</span><span style="color: #000000">)size);<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000"><br />
<img id="Codehighlighter1_515_546_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_515_546_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_515_546_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_515_546_Closed_Text').style.display='inline';" alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_515_546_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_515_546_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_515_546_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_515_546_Open_Text').style.display='inline';" alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_515_546_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_515_546_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(readed)&nbsp;</span><span style="color: #0000ff">break</span><span style="color: #000000">;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zip.Close();<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;db&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;msD.ToArray();<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;msD.Close();<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;System.Text.Encoding.UTF8.GetString(db);<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></span></div>
大家看到，处于无奈增加一个标志，虽然问题解决了，但是总觉得不自在：），希望有高手指点一二！<br />
<hr />
时隔一年，终得巴山兄解惑，特此鸣谢！同样迷惑者请看巴山的回复。<br />
<img src ="http://www.cnblogs.com/dajianshi/aggbug/1111180.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47989/" target="_blank">Twitter无处不在 魔兽世界Twitter发送器插件发布</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>log4net为啥不工作了？</title><link>http://www.cnblogs.com/dajianshi/archive/2007/11/22/968754.html</link><dc:creator>大剑师</dc:creator><author>大剑师</author><pubDate>Thu, 22 Nov 2007 08:19:00 GMT</pubDate><guid>http://www.cnblogs.com/dajianshi/archive/2007/11/22/968754.html</guid><wfw:comment>http://www.cnblogs.com/dajianshi/comments/968754.html</wfw:comment><comments>http://www.cnblogs.com/dajianshi/archive/2007/11/22/968754.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/dajianshi/comments/commentRss/968754.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/dajianshi/services/trackbacks/968754.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.cnblogs.com/dajianshi/archive/2007/11/22/968754.html'>阅读全文</a><img src ="http://www.cnblogs.com/dajianshi/aggbug/968754.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47988/" target="_blank">Firefox 3.5匆忙推出漏洞多 Mozilla本月将更新</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>[翻译]建立你的第一个Visual WebGui应用程序</title><link>http://www.cnblogs.com/dajianshi/archive/2007/11/16/961502.html</link><dc:creator>大剑师</dc:creator><author>大剑师</author><pubDate>Fri, 16 Nov 2007 04:25:00 GMT</pubDate><guid>http://www.cnblogs.com/dajianshi/archive/2007/11/16/961502.html</guid><wfw:comment>http://www.cnblogs.com/dajianshi/comments/961502.html</wfw:comment><comments>http://www.cnblogs.com/dajianshi/archive/2007/11/16/961502.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/dajianshi/comments/commentRss/961502.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/dajianshi/services/trackbacks/961502.html</trackback:ping><description><![CDATA[Developing your first Visual WebGui Application&nbsp;&nbsp; <a id="dnn_ctr778_NewsArticles_ucArticleView_rptListing__ctl1_NewsArticles_8903_4" title="Click to print" href="http://www.visualwebgui.com/DesktopModules/DnnForge%20-%20NewsArticles/Print.aspx?tabid=327&amp;tabmoduleid=890&amp;articleId=3&amp;moduleId=778&amp;PortalID=0" target="_blank"><img title="Click to print" src="http://www.visualwebgui.com/images/print.gif" alt="" border="0" /></a><br />
<div>
<strong>Published on:</strong>&nbsp;&nbsp;Wednesday, April 18, 2007<br />
<strong>By:</strong>&nbsp;&nbsp;Guy<br />
<strong>User Rating:&nbsp;&nbsp;</strong><img id="dnn_ctr778_NewsArticles_ucArticleView_rptListing__ctl1_NewsArticles_8903_12" title="Article Rating" src="http://www.visualwebgui.com/DesktopModules%5CDnnForge%20-%20NewsArticles%5CImages%5CRating%5Cstars-4-0.gif" alt="" align="absmiddle" border="0" />
<br />
<strong>Categories:&nbsp;&nbsp;</strong><a href="http://www.visualwebgui.com/Community/Resources/Articles/tabid/327/articleType/CategoryView/categoryId/1/How-to.aspx"> How to?</a>
<br />
<p><img alt="Screenshot" src="http://www.codeproject.com/useritems/visualwebgui_intro/visualwebgui_intro.gif" /></p>
<h2>介绍<br />
</h2>
<p nd="1">虽然目前的Web开发环境，例如ASP.NET 和JSP，在建立富Web应用方面有了长足的进步，但是这些环境因为要满足开发多种从内容丰富的门户到类似OWA的应用，不得不有所妥协，对于开发者来说开发某种类型的Web应用不得不忍受痛苦了。pages, html, requests and responses等历史上继承来的多种多样复杂的概念确实不适和开发web应用程序。虽然各种AJAX frameworks给这些开发环境增色不少，但是毕竟也是基于原来的Web开发概念，甚至更加剧了Web开发的复杂性，远远超过了开发桌面的应用。 </p>
<h2>背景</h2>
<p nd="2">&nbsp;&nbsp;&nbsp; Visual WebGui是一个新型的AJAX framework，给开发Web应用带来了一条不同的方式，并且特别适合开发一个高度复杂的应用，就像Outlook Web Access (OWA).
Visual WebGui使得开发者可以使用完全的WinForms服务器端的API，并且有设计时支持。通过借用WinForms的对象控件和开发方式的概念，Visual WebGui使得开发web应用变得非常简单。当当你使用它开发一个类似OWA的web应用的时候，更像是用VB/WinForms开发，而不是在写一个web应用。 </p>
<p nd="3">&nbsp;&nbsp;&nbsp; Visual WebGui是开源的并且对于非商业应用是免费的（<a href="http://sourceforge.net/projects/visualwebgui">SourceForge.net</a>下载源码）。Visual WebGui 站点上有多种免费license类型，你甚至可以用到你的产品当中。</p>
<p nd="4">&nbsp;&nbsp;&nbsp; 本文目的是创建一个AJAX化的web应用，用于浏览wwwroot目录，左边是目录树，右边窗格中显示当前选中目录中的文件。</p>
<h2>代码</h2>
<p nd="5">&nbsp;&nbsp;&nbsp; 要开始使用Visual WebGui开发，你首先需要下载SDK。<a href="http://www.visualwebgui.com/Products/Downloads/tabid/110/Default.aspx">download page</a>.
安装程序会在你的GAC中添加几个Assembly，并且在你的开发环境中添加开发Visual WebGui项目的能力。在你的Visual Studio中会多出两种应用项目类型：WebGui Application and WebGui Control Library。WebGui Application项目类型用于创建ASP.NET新项目，项目中会有一个名为Form1.cs的类而不是你所熟悉的WebForm1.aspx。Form1.cs继承自<code nd="6">Gizmox.WebGUI.Forms.Form</code>
，并且有着和WinForms类似的设计时支持。当你打开Form1.cs的设计界面时，在你的工具箱中，会发现有一个新增的 WebGUI工具组。里面的组件就像WinForm的组件一样可以拖拽的设计区。选中设计区中的组件后，你可以在属性窗口中更改属性，特别的是包含有一些像WinForm中一样的Dock和Anchoring等的属性，这些都是Visual WebGui所支持的。 </p>
<p nd="7">&nbsp;&nbsp;&nbsp; 在你开始运行应用之前，你需要在Visual Studio中，打开项目属性，将开始页设置为名字为Form1.wgx的虚拟页面。Visual WebGui 使用".wgx"扩展名，如果使用IIS服务，你需要参照".aspx"的映射，在IIS中添加对wgx的扩展名映射，但是，不能选中&#8220;检查文件是否存在的&#8221;复选框，应为Visual
WebGui使用的是虚拟页面。设置完成后，你就可以像调试一个WinForms应用一样调试你的程序了。</p>
<h2>第一步：建立一个WebGui Application项目</h2>
<p nd="8">&nbsp;&nbsp;&nbsp; 打开新建项目对话框，选中&#8221;WebGui Application
project&#8220;，然后输入项目的名称，点击确定按钮。
</p>
<p align="center"><img alt="" src="http://www.codeproject.com/useritems/visualwebgui_intro/visualwebgui_intro1.gif" /></p>
<p nd="9">&nbsp;&nbsp;&nbsp; Visual WebGui将会建立一个既像ASP.NET，又有WinFroms特征的项目，这是因为项目的结构类似于ASP.NET，但是包含的窗体却像是WinForm形式的窗体。双击form1.cs，打开设计界面，你会发现完全类似于WinForm的设计界面。Visual
Studio的工具箱中，已经添加了一组名为WebGUI的组件，你将发现这些组件和WinForms中的组件几乎一模一样。你可以像开发WinForms程序那样拖拽添加这些组件，<code nd="10">Visual WebGui也会自动在InitializeComponent方法中添加生成代码。</code> </p>
<p align="center"><img alt="" src="http://www.codeproject.com/useritems/visualwebgui_intro/visualwebgui_intro2.gif" /></p>
<h2>第二步：建立主窗体</h2>
<p nd="11">&nbsp;&nbsp;&nbsp; 从WebGUI工具箱中拖拽一个treeview控件添加到设计区中。设计器就会为你创建一个TreeView，你可以在属性窗中更改控件的属性值。在属性窗中选择Dock属性，值改为Left。这将使设计器把treeview控件固定在左边。你可以调整treeview的宽度。现在，从WebGUI工具箱中选择splitter控件，并且拖拽到设计区，设计器会默认的将splitter的dock值设为left，在这里正好符合我的意图。再添加一个listview，Dock设为Fill，这将使得它铺满剩下的设计区空间。<br />
</p>
<h2>第三步：填充treeview</h2>
<p nd="12">&nbsp;&nbsp;&nbsp; 在属性窗中的下拉框中选中form以显示form的属性，然后切换到事件页，双击Load事件，设计器将会产生一个空的事件处理程序。load事件将在Visual WebGui窗体装载后执行。添加一个新的方法LoadFolders，接收<code nd="13">TreeNodeCollection 和 表示路径的字符串 两个参数。</code>在load事件中调用此方法，<code nd="15">参数使用treeview1.Nodes和</code> <code nd="16">@<span nd="17">"C:"inetpub"wwwroot"，这使得程序装载第一层的文件夹列表。</span></code><br />
</p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;Form1_Load(</span><span style="color: #0000ff;">object</span><span style="color: #000000;">&nbsp;sender,&nbsp;System.EventArgs&nbsp;e)<br />
{<br />
&nbsp;&nbsp;&nbsp; LoadFolders(treeView1.Nodes,</span><span style="color: #000000;">@"</span><span style="color: #000000;">C:</span><span style="color: #000000;">"</span><span style="color: #000000;">inetpub</span><span style="color: #000000;">"</span><span style="color: #000000;">wwwroot</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
}<br />
</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;treeView1_BeforeExpand(</span><span style="color: #0000ff;">object</span><span style="color: #000000;">&nbsp;sender,&nbsp;Gizmox.WebGUI.Forms.TreeViewCancelEventArgs&nbsp;e)<br />
{<br />
</span><span style="color: #0000ff;">&nbsp;if</span><span style="color: #000000;">(</span><span style="color: #000000;">!</span><span style="color: #000000;">e.Node.Loaded)<br />
&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;LoadFolders(e.Node.Nodes,e.Node.Tag&nbsp;</span><span style="color: #0000ff;">as</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;e.Node.Loaded&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">true</span><span style="color: #000000;">;<br />
&nbsp;}<br />
}<br />
</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;LoadFolders(TreeNodeCollection&nbsp;nodes,</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;path)<br />
{<br />
&nbsp;DirectoryInfo&nbsp;dir&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;DirectoryInfo(path);<br />
</span><span style="color: #0000ff;">&nbsp;bool</span><span style="color: #000000;">&nbsp;hasFolders&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;dir.GetDirectories().Length</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br />
</span><span style="color: #008000;">&nbsp;//</span><span style="color: #008000;">&nbsp;Loop&nbsp;all&nbsp;sub&nbsp;directories</span><span style="color: #008000;"><br />
</span><span style="color: #0000ff;">&nbsp; foreach</span><span style="color: #000000;">(DirectoryInfo&nbsp;subdir&nbsp;</span><span style="color: #0000ff;">in</span><span style="color: #000000;">&nbsp;dir.GetDirectories())<br />
&nbsp; {<br />
</span><span style="color: #008000;">&nbsp; //</span><span style="color: #008000;">&nbsp;Create&nbsp;a&nbsp;new&nbsp;tree&nbsp;node</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp; TreeNode&nbsp;node&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;TreeNode();<br />
&nbsp;&nbsp;&nbsp; node.Text&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;subdir.Name;<br />
&nbsp;&nbsp;&nbsp; node.Tag&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;subdir.FullName;<br />
&nbsp;&nbsp;&nbsp; node.IsExpanded&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">!</span><span style="color: #000000;">hasFolders;<br />
&nbsp;&nbsp;&nbsp; node.Loaded&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">!</span><span style="color: #000000;">hasFolders;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;"> 这个属性是一个WinForms&nbsp;API中没有的扩展属性</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp; node.HasNodes&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;hasFolders;<br />
&nbsp;&nbsp;&nbsp; nodes.Add(node);<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
</span></div>
<p nd="24">&nbsp;&nbsp;&nbsp; 在LoadFolder方法中我们添加了遍历当前目录下的子目录，然后添加到传来的<code nd="25">TreeNode的子节点中</code>。</p>
<h2>第四步：填充listview</h2>
<p nd="26">&nbsp;&nbsp;&nbsp; 定位到Form1的构造函数添加如下代码，在这里设置了listview的UseInternalPaging属性为true，这将使得Visual WebGui自动为我们处理分页逻辑。 </p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Form1()<br />
{<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;This&nbsp;call&nbsp;is&nbsp;required&nbsp;by&nbsp;the&nbsp;WebGUI&nbsp;Form&nbsp;Designer.</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">InitializeComponent();<br />
listView1.Columns.Add(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ColumnHeader(</span><span style="color: #000000;">"</span><span style="color: #000000;">Name</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">"</span><span style="color: #000000;">Name</span><span style="color: #000000;">"</span><span style="color: #000000;">));<br />
listView1.Columns.Add(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ColumnHeader(</span><span style="color: #000000;">"</span><span style="color: #000000;">Extension</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">"</span><span style="color: #000000;">Extension</span><span style="color: #000000;">"</span><span style="color: #000000;">));<br />
listView1.UseInternalPaging&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">true</span><span style="color: #000000;">;<br />
}</span></div>
<p nd="32">&nbsp;&nbsp;&nbsp; 下面为treeview添加一个AfterSelect的事件处理程序，程序中将使用<code nd="33">e.Node.Tag</code>来接收需要显示文件的路径名。在向listview中添加项目之前，需要先清除现有的项目。</p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;treeView1_AfterSelect(</span><span style="color: #0000ff;">object</span><span style="color: #000000;">&nbsp;sender,&nbsp;Gizmox.WebGUI.Forms.TreeViewEventArgs&nbsp;e)<br />
{<br />
&nbsp;DirectoryInfo&nbsp;dir&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;DirectoryInfo(e.Node.Tag&nbsp;</span><span style="color: #0000ff;">as</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">);<br />
&nbsp;listView1.Items.Clear();<br />
</span><span style="color: #008000;">&nbsp;//</span><span style="color: #008000;">&nbsp;Loop&nbsp;all&nbsp;files&nbsp;in&nbsp;directory</span><span style="color: #008000;"><br />
</span><span style="color: #0000ff;">&nbsp;foreach</span><span style="color: #000000;">(FileInfo&nbsp;file&nbsp;</span><span style="color: #0000ff;">in</span><span style="color: #000000;">&nbsp;dir.GetFiles())<br />
&nbsp;{<br />
&nbsp;ListViewItem&nbsp;item&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;listView1.Items.Add(file.Name);<br />
&nbsp;item.SubItems.Add(file.Extension);<br />
&nbsp;}<br />
}<br />
</span></div>
<h2>第四步：添加图标美化一下界面</h2>
<p nd="35">&nbsp;&nbsp;&nbsp; Visual WebGui的资源管理方式和WinForms是不同的，由于运行环境不同，在多线程的情况下像那样处理资源就有些负担太大了。Visual WebGui有独特的引用资源的处理方式，在这种方式下Visaul WebGui
服务器端可以优化缓存，当不同的线程引用同一资源时可以提高速度节省资源占用。Visual WebGui包括一些默认的资源处理程序<code nd="36">IconResourceHandler和</code> <code nd="37">ImageResourceHandle</code>，在Visual WebGui配置中指向不同的路径。资源处理程序使用java式的定位方法，这意味着路径名之间用点分隔。</p>
<p nd="38">在Form1.cs中添加新的引用，以便你可以创建资源处理对象：<br />
<span style="color: #0817ff;">using Gizmox.WebGUI.Common.Resources;</span><br />
</p>
<p nd="40">下面的程序再TreeNode和ListViewItem中添加图标:</p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;LoadFolders(TreeNodeCollection&nbsp;nodes,</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;path)<br />
{<br />
&nbsp; DirectoryInfo&nbsp;dir&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;DirectoryInfo(path);<br />
&nbsp; </span><span style="color: #0000ff;">bool</span><span style="color: #000000;">&nbsp;hasFolders&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;&nbsp;dir.GetDirectories().Length</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br />
</span><span style="color: #008000;">&nbsp;//</span><span style="color: #008000;">&nbsp;Loop&nbsp;all&nbsp;sub&nbsp;directories</span><span style="color: #008000;"><br />
</span><span style="color: #0000ff;">&nbsp;&nbsp;&nbsp; foreach</span><span style="color: #000000;">(DirectoryInfo&nbsp;subdir&nbsp;</span><span style="color: #0000ff;">in</span><span style="color: #000000;">&nbsp;dir.GetDirectories())<br />
&nbsp;&nbsp;&nbsp; {<br />
</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp; //</span><span style="color: #008000;">&nbsp;Create&nbsp;a&nbsp;new&nbsp;tree&nbsp;node</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp; TreeNode&nbsp;node&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;TreeNode();<br />
&nbsp;&nbsp;&nbsp; node.Text&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;subdir.Name;<br />
&nbsp;&nbsp;&nbsp; node.Tag&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;subdir.FullName;<br />
&nbsp;&nbsp;&nbsp; node.IsExpanded&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">!</span><span style="color: #000000;">hasFolders;<br />
&nbsp;&nbsp;&nbsp; node.Loaded&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">!</span><span style="color: #000000;">hasFolders;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;This&nbsp;property&nbsp;is&nbsp;an&nbsp;extension&nbsp;to&nbsp;the&nbsp;WinForms&nbsp;API</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp; node.HasNodes&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;hasFolders;<br />
</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp; //</span><span style="color: #008000;">&nbsp;Add&nbsp;icon&nbsp;to&nbsp;tree&nbsp;node</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp; node.Image&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;IconResourceHandle(</span><span style="color: #000000;">"</span><span style="color: #000000;">folder.gif</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp; nodes.Add(node);<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;treeView1_AfterSelect(</span><span style="color: #0000ff;">object</span><span style="color: #000000;">&nbsp;sender,&nbsp;Gizmox.WebGUI.Forms.TreeViewEventArgs&nbsp;e)<br />
{<br />
&nbsp; DirectoryInfo&nbsp;dir&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;DirectoryInfo(e.Node.Tag&nbsp;</span><span style="color: #0000ff;">as</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">);<br />
&nbsp; listView1.Items.Clear();<br />
</span><span style="color: #008000;">&nbsp; //</span><span style="color: #008000;">&nbsp;Loop&nbsp;all&nbsp;files&nbsp;in&nbsp;directory</span><span style="color: #008000;"><br />
</span><span style="color: #0000ff;">&nbsp;&nbsp;&nbsp; foreach</span><span style="color: #000000;">(FileInfo&nbsp;file&nbsp;</span><span style="color: #0000ff;">in</span><span style="color: #000000;">&nbsp;dir.GetFiles())<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp; ListViewItem&nbsp;item&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;listView1.Items.Add(file.Name);<br />
&nbsp;&nbsp;&nbsp; item.SubItems.Add(file.Extension);<br />
</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp; //</span><span style="color: #008000;">&nbsp;Add&nbsp;icon&nbsp;to&nbsp;item</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp; item.Image&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;IconResourceHandle(</span><span style="color: #000000;">"</span><span style="color: #000000;">file.gif</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp; }<br />
}</span></div>
<h2>结论<br />
</h2>
&nbsp;&nbsp;&nbsp; 正如你在例子中所看到的，Visual WebGui利用WinForms的概念简化了web应用的开发。设计器，对象模型和语法都和开发WinForms一致，这意味着，你可以迅速的迁移现有的WinForms项目、代码以及经验到Visual WebGui平台中来，建立复杂的交互的web应用不一定需要掌握AJAX, Javascript, XML 和
HTML，所需要的就是熟悉桌面应用的已经被证明是有生产力的开发技巧。</div>
<img src ="http://www.cnblogs.com/dajianshi/aggbug/961502.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47987/" target="_blank">预测：Twitter最可能收购的十家公司</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>正则表达式30分钟入门教程[收藏]</title><link>http://www.cnblogs.com/dajianshi/archive/2007/11/13/957559.html</link><dc:creator>大剑师</dc:creator><author>大剑师</author><pubDate>Tue, 13 Nov 2007 01:06:00 GMT</pubDate><guid>http://www.cnblogs.com/dajianshi/archive/2007/11/13/957559.html</guid><description><![CDATA[<h1>正则表达式30分钟入门教程(第二版)</h1>
<p style="text-align: center">作者：<a href="http://www.unibetter.com/blogs/blogdeerchao/default.aspx">deerchao</a> 来源:<a href="http://www.unibetter.com/">unibetter大学生社区</a> 转载请注明来源 <a href="http://www.unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng.htm">本文第一版</a></p>
<h2>目录</h2>
<ol>
    <li><a href="http://blog.csdn.net/mfkidt/archive/2006/10/13/1333364.aspx#h1">本文目标</a> </li>
    <li><a href="http://blog.csdn.net/mfkidt/archive/2006/10/13/1333364.aspx#h2">如何使用本教程</a> </li>
    <li><a href="http://blog.csdn.net/mfkidt/archive/2006/10/13/1333364.aspx#h3">什么是正则表达式？</a> </li>
    <li><a href="http://blog.csdn.net/mfkidt/archive/2006/10/13/1333364.aspx#h4">入门</a> </li>
    <li><a href="http://blog.csdn.net/mfkidt/archive/2006/10/13/1333364.aspx#h5">测试正则表达式</a> </li>
    <li><a href="http://blog.csdn.net/mfkidt/archive/2006/10/13/1333364.aspx#h6">元字符</a> </li>
    <li><a href="http://blog.csdn.net/mfkidt/archive/2006/10/13/1333364.aspx#h7">字符转义</a> </li>
    <li><a href="http://blog.csdn.net/mfkidt/archive/2006/10/13/1333364.aspx#h8">重复</a> </li>
    <li><a href="http://blog.csdn.net/mfkidt/archive/2006/10/13/1333364.aspx#h9">字符类</a> </li>
    <li><a href="http://blog.csdn.net/mfkidt/archive/2006/10/13/1333364.aspx#h10">反义</a> </li>
    <li><a href="http://blog.csdn.net/mfkidt/archive/2006/10/13/1333364.aspx#h11">替换</a> </li>
    <li><a href="http://blog.csdn.net/mfkidt/archive/2006/10/13/1333364.aspx#h12">分组</a> </li>
    <li><a href="http://blog.csdn.net/mfkidt/archive/2006/10/13/1333364.aspx#h13">后向引用</a> </li>
    <li><a href="http://blog.csdn.net/mfkidt/archive/2006/10/13/1333364.aspx#h14">位置指定</a> </li>
    <li><a href="http://blog.csdn.net/mfkidt/archive/2006/10/13/1333364.aspx#h15">负向位置指定</a> </li>
    <li><a href="http://blog.csdn.net/mfkidt/archive/2006/10/13/1333364.aspx#h16">注释</a> </li>
    <li><a href="http://blog.csdn.net/mfkidt/archive/2006/10/13/1333364.aspx#h17">贪婪与懒惰</a> </li>
    <li><a href="http://blog.csdn.net/mfkidt/archive/2006/10/13/1333364.aspx#h18">平衡组</a> </li>
    <li><a href="http://blog.csdn.net/mfkidt/archive/2006/10/13/1333364.aspx#h19">还有些什么东西没提到</a> </li>
    <li><a href="http://blog.csdn.net/mfkidt/archive/2006/10/13/1333364.aspx#reference">一些我认为你可能已经知道的术语的参考</a> </li>
    <li><a href="http://blog.csdn.net/mfkidt/archive/2006/10/13/1333364.aspx#h21">网上的资源及本文参考文献</a> </li>
    <li><a href="http://blog.csdn.net/mfkidt/archive/2006/10/13/1333364.aspx#h22">第二版更新说明</a> </li>
</ol>
<h2 id="h1">本文目标</h2>
<p>30分钟内让你明白正则表达式是什么，并对它有一些基本的了解，让你可以在自己的程序或网页里使用它。</p>
<h2 id="h2">如何使用本教程</h2>
<p>别被下面那些复杂的表达式吓倒，只要跟着我一步一步来，你会发现正则表达式其实并不像你想像中的那么困难。当然，如果你看完了这篇教程之后发现自己明白了很多，却又几乎什么都记不得，那也是很正常的——其实我认为没接触过正则表达式的人在看完这篇教程后能把提到过的语法记住80%以上的可能性为零。这里只是让你明白基本道理，以后你还需要多练习，多查资料，才能熟练掌握正则表达式。</p>
<p>除了作为入门教程之外，本文还试图成为可以在日常工作中使用的正则表达式语法参考手册（就作者本人的经历来说，这个目标还是完成得不错的）。</p>
<p>文本格式约定：<span class="name"><strong>专业术语</strong></span>&nbsp;<span class="code"><font color="#0000ff">元字符/语法格式</font></span>&nbsp;<span class="regex"><font color="#ff0000">正则表达式</font></span>&nbsp;<span class="part"><font color="#008000">正则表达式中的一部分(用于分析)</font></span>&nbsp;<span class="string"><em>用于在其中搜索的字符串</em></span>&nbsp;<span class="desc">对正则表达式或其中一部分的说明</span><input id="clearButton" accesskey="c" onclick="clearFormats();" type="button" value="清除格式(Alt+C)" /></p>
<h2 id="h3">什么是正则表达式？</h2>
<p>在编写处理字符串的程序或网页时，经常会有查找符合某些复杂规则的字符串的需要。<span class="name"><strong>正则表达式</strong></span>就是用于描述这些规则的工具。换句话说，正则表达式就是记录文本规则的代码。</p>
<p>很可能你使用过Windows/Dos下用于文件查找的<span class="name"><strong>通配符(wildcard)</strong></span>，也就是<span class="code"><font color="#0000ff">*</font></span>和<span class="code"><font color="#0000ff">?</font></span>。如果你想查找某个目录下的所有的Word文档的话，你会搜索<span style="color: red">*.doc</span>。在这里，<span class="code"><font color="#0000ff">*</font></span>会被解释成任意的<a title="参考" href="http://www.unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm#reference">字符串</a>。和通配符类似，正则表达式也是用来进行<a title="参考" href="http://www.unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm#reference">文本</a><a title="参考" href="http://www.unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm#reference">匹配</a>的工具，只不过比起通配符它能更精确地描述你的需求——当然，代价就是更复杂。比如你可以编写一个正则表达式来查找<span class="desc"><u>所有以0开头，后面跟着2-3个数字，然后是一个连字号&#8220;-&#8221;，最后是7或8位数字的字符串</u></span>(像<span class="string"><em>010-12345678</em></span>或<span class="string"><em>0376-7654321</em></span>)。</p>
<p id="match">正则表达式是用于进行文本匹配的工具，所以本文里多次提到了在字符串里搜索/查找，这种说法的意思是在给定的字符串中，寻找与给定的正则表达式相匹配的部分。有可能字符串里有不止一个部分满足给定的正则表达式，这时每一个这样的部分被称为一个匹配。<span class="name"><strong>匹配</strong></span>在本文里可能会有三种意思：一种是形容词性的，比如说一个字符串匹配一个表达式；一种是动词性的，比如说在字符串里匹配正则表达式；还有一种是名词性的，就是刚刚说到的&#8220;字符串中满足给定的正则表达式的一部分&#8221;。</p>
<h2 id="h4">入门</h2>
<p>学习正则表达式的最好方法是从例子开始，理解例子之后再自己对例子进行修改，实验。下面给出了不少简单的例子，并对它们作了详细的说明。</p>
<p>假设你在一篇英文小说里查找<span class="desc"><u>hi</u></span>，你可以使用正则正则表达式<span class="regex"><font color="#ff0000">hi</font></span>。</p>
<p>这是最简单的正则表达式了，它可以精确匹配这样的字符串：<span class="desc"><u>由两个字符组成，前一个字符是h,后一个是i</u></span>。通常，处理正则表达式的工具会提供一个忽略大小写的选项，如果选中了这个选项，它可以匹配<span class="string"><em>hi</em></span>,<span class="string"><em>HI</em></span>,<span class="string"><em>Hi</em></span>,<span class="string"><em>hI</em></span>这四种情况中的任意一种。</p>
<p>不幸的是，很多单词里包含<span class="string"><em>hi</em></span>这两个连续的字符，比如<span class="string"><em>him</em></span>,<span class="string"><em>history</em></span>,<span class="string"><em>high</em></span>等等。用<span class="regex"><font color="#ff0000">hi</font></span>来查找的话，这里边的<span class="string"><em>hi</em></span>也会被找出来。如果要<span class="desc"><u>精确地查找hi这个单词</u></span>的话，我们应该使用<span class="regex"><font color="#ff0000">\bhi\b</font></span>。</p>
<p><span class="part"><font color="#008000">\b</font></span>是正则表达式规定的一个特殊代码（好吧，某些人叫它<span class="name"><strong>元字符，metacharacter</strong></span>），代表着<span class="desc"><u>单词的开头或结尾，也就是单词的分界处</u></span>。虽然通常英文的单词是由空格或标点符号或换行来分隔的，但是<span class="code"><font color="#0000ff">\b</font></span>并不匹配这些单词分隔符中的任何一个，它<strong>只匹配一个位置</strong>。（如果需要更精确的说法，<span class="code"><font color="#0000ff">\b</font></span>匹配这样的位置：它的前一个字符和后一个字符不全是<span class="code"><font color="#0000ff">\w</font></span>）</p>
<p>假如你要找的是<span class="desc"><u>hi后面不远处跟着一个Lucy</u></span>，你应该用<span class="regex"><font color="#ff0000">\bhi\b.*\bLucy\b</font></span>。</p>
<p>这里，<span class="part"><font color="#008000">.</font></span>是另一个元字符，匹配<span class="desc"><u>除了换行符以外的任意字符</u></span>。<span class="part"><font color="#008000">*</font></span>同样是元字符，不过它代表的不是字符，也不是位置，而是数量--它指定*<span class="desc"><u>前边的内容可以重复任意次以使整个表达式得到匹配</u></span>。因此，<span class="part"><font color="#008000">.*</font></span>连在一起就意味着<span class="desc"><u>任意数量的不包含换行的字符</u></span>。现在<span class="regex"><font color="#ff0000">\bhi\b.*\bLucy\b</font></span>的意思就很明显了：<span class="desc"><u>先是一个单词hi,然后是任意个任意字符(但不能是换行)，最后是Lucy这个单词</u></span>。</p>
<p>如果同时使用其它的一些元字符，我们就能构造出功能更强大的正则表达式。比如下面这个例子：</p>
<p><span class="regex"><font color="#ff0000">0\d\d-\d\d\d\d\d\d\d\d</font></span>匹配这样的字符串：<span class="desc"><u>以0开头，然后是两个数字，然后是一个连字号&#8220;-&#8221;，最后是8个数字</u></span>(也就是中国的电话号码。当然，这个例子只能匹配区号为3位的情形)。</p>
<p>这里的<span class="part"><font color="#008000">\d</font></span>是一个新的元字符，匹配<span class="desc"><u>任意的数字(0，或1，或2，或&#8230;&#8230;)</u></span>。<span class="part"><font color="#008000">-</font></span>不是元字符，只匹配它本身——连字号。</p>
<p>为了避免那么多烦人的重复，我们也可以这样写这个表达式：<span class="regex"><font color="#ff0000">0\d{2}-\d{8}</font></span></p>
<p>这里<span class="part"><font color="#008000">\d</font></span>后面的<span class="part"><font color="#008000">{2}</font></span>(<span class="part"><font color="#008000">{8}</font></span>)的意思是前面<span class="part"><font color="#008000">\d</font></span><span class="desc"><u>必须连续重复匹配2次(8次)</u></span>。</p>
<h2 id="h5">测试正则表达式</h2>
<p>如果你不觉得正则表达式很难读写的话，要么你是一个天才，要么，你不是地球人。正则表达式的语法很令人头疼，即使对经常使用它的人来说也是如此。由于难于读写，容易出错，所以很有必要创建一种工具来测试正则表达式。</p>
<p>由于在不同的环境下正则表达式的一些细节是不相同的，本教程介绍的是Microsoft .Net 2.0下正则表达式的行为，所以，我向你介绍一个.Net下的工具<a href="http://www.dotnet2themax.com/blogs/fbalena/PermaLink,guid,13bce26d-7755-441e-92b3-1eb5f9e859f9.aspx">Regex Tester</a>。首先你确保已经安装了<a title="转到下载.Net Framework 2.0的页面" href="http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&amp;FamilyID=0856eacb-4362-4b0d-8edd-aab15c5e04f5">.Net Framework 2.0</a>，然后<a title="本地下载Regex Tester, 75KB" href="http://www.unibetter.com/deerchao/downloads/RegexTester.zip">下载Regex Tester</a>，下载完后打开压缩包，运行setup.exe安装。</p>
<p>下面是Regex Tester运行时的截图：</p>
<p><img alt="Regex Tester运行时的截图" src="http://www.unibetter.com/deerchao/images/RegexTester.jpg" /></p>
<h2 id="h6">元字符</h2>
<p>现在你已经知道几个很有用的元字符了，如<span class="code"><font color="#0000ff">\b</font></span>,<span class="code"><font color="#0000ff">.</font></span>,<span class="code"><font color="#0000ff">*</font></span>，还有<span class="code"><font color="#0000ff">\d</font></span>.当然还有更多的元字符，比如<span class="code"><font color="#0000ff">\s</font></span>匹配<span class="desc"><u>任意的空白符，包括空格，制表符(Tab)，换行符，中文全角空格等</u></span>。<span class="code"><font color="#0000ff">\w</font></span>匹配<span class="desc"><u>字母或数字或下划线或汉字</u></span>。</p>
<p>下面来试试更多的例子：</p>
<p><span class="regex"><font color="#ff0000">\ba\w*\b</font></span>匹配<span class="desc"><u>以字母<span class="part"><font color="#008000">a</font></span>开头的单词——先是某个单词开始处(<span class="part"><font color="#008000">\b</font></span>)，然后是字母<span class="part"><font color="#008000">a</font></span>,然后是任意数量的字母或数字(<span class="part"><font color="#008000">\w*</font></span>)，最后是单词结束处(<span class="part"><font color="#008000">\b</font></span>)</u></span>（好吧，现在我们说说这里的单词是什么意思吧：就是几个连续的<span class="code"><font color="#0000ff">\w</font></span>。不错，这与学习英文时要背的成千上万个同名的东西的确关系不大）。</p>
<p><span class="regex"><font color="#ff0000">\d+</font></span>匹配<span class="desc"><u>1个或更多连续的数字</u></span>。这里的<span class="part"><font color="#008000">+</font></span>是和<span class="code"><font color="#0000ff">*</font></span>类似的元字符，不同的是<span class="code"><font color="#0000ff">*</font></span>匹配<span class="desc"><u>重复任意次(可能是0次)</u></span>，而<span class="code"><font color="#0000ff">+</font></span>则匹配<span class="desc"><u>重复1次或更多次</u></span>。</p>
<p><span class="regex"><font color="#ff0000">\b\w{6}\b</font></span> 匹配<span class="desc"><u>刚好6个字母/数字的单词</u></span>。</p>
<p>
<table cellspacing="0">
    <caption>表1.常用的元字符</caption>
    <tbody>
        <tr>
            <th>代码</th>
            <th>说明</th>
        </tr>
        <tr>
            <td><span class="code"><font color="#0000ff">.</font></span></td>
            <td><span class="desc"><u>匹配除换行符以外的任意字符</u></span></td>
        </tr>
        <tr>
            <td><span class="code"><font color="#0000ff">\w</font></span></td>
            <td><span class="desc"><u>匹配字母或数字或下划线或汉字</u></span></td>
        </tr>
        <tr>
            <td><span class="code"><font color="#0000ff">\s</font></span></td>
            <td><span class="desc"><u>匹配任意的空白符</u></span></td>
        </tr>
        <tr>
            <td><span class="code"><font color="#0000ff">\d</font></span></td>
            <td><span class="desc"><u>匹配数字</u></span></td>
        </tr>
        <tr>
            <td><span class="code"><font color="#0000ff">\b</font></span></td>
            <td><span class="desc"><u>匹配单词的开始或结束</u></span></td>
        </tr>
        <tr>
            <td><span class="code"><font color="#0000ff">^</font></span></td>
            <td><span class="desc"><u>匹配字符串的开始</u></span></td>
        </tr>
        <tr>
            <td><span class="code"><font color="#0000ff">$</font></span></td>
            <td><span class="desc"><u>匹配字符串的结束</u></span></td>
        </tr>
    </tbody>
</table>
</p>
<p>元字符<span class="code"><font color="#0000ff">^</font></span>（和6在同一个键位上的符号）以及<span class="code"><font color="#0000ff">$</font></span>和<span class="code"><font color="#0000ff">\b</font></span>有点类似，都匹配一个位置。<span class="code"><font color="#0000ff">^</font></span>匹配你要用来查找的字符串的开头，<span class="code"><font color="#0000ff">$</font></span>匹配结尾。这两个代码在验证输入的内容时非常有用，比如一个网站如果要求你填写的QQ号必须为5位到12位数字时，可以使用：<span class="regex"><font color="#ff0000">^\d{5,12}$</font></span>。</p>
<p>这里的<span class="part"><font color="#008000">{5,12}</font></span>和前面介绍过的<span class="part"><font color="#008000">{2}</font></span>是类似的，只不过<span class="part"><font color="#008000">{2}</font></span>匹配<span class="desc"><u>只能不多不少重复2次</u></span>，<span class="part"><font color="#008000">{5,12}</font></span>则是<span class="desc"><u>必须重复最少5次，最多12次</u></span>，否则都不匹配。</p>
<p>因为使用了<span class="part"><font color="#008000">^</font></span>和<span class="part"><font color="#008000">$</font></span>，所以输入的整个字符串都要用来和<span class="part"><font color="#008000">\d{5,12}</font></span>来匹配，也就是说整个输入<span class="desc"><u>必须是5到12个数字</u></span>，因此如果输入的QQ号能匹配这个正则表达式的话，那就符合要求了。</p>
<p>和忽略大小写的选项类似，有些正则表达式处理工具还有一个处理多行的选项。如果选中了这个选项，<span class="code"><font color="#0000ff">^</font></span>和<span class="code"><font color="#0000ff">$</font></span>的意义就变成了<span class="desc"><u>匹配行的开始处和结束处</u></span>。</p>
<h2 id="h7">字符转义</h2>
<p>如果你想查找元字符本身的话，比如你查找<span class="desc"><u>.</u></span>,或者<span class="desc"><u>*</u></span>,就出现了问题：你没法指定它们，因为它们会被解释成其它的意思。这时你就必须使用<span class="code"><font color="#0000ff">\</font></span>来取消这些字符的特殊意义。因此，你应该使用<span class="regex"><font color="#ff0000">\.</font></span>和<span class="regex"><font color="#ff0000">\*</font></span>。当然，要查找<span class="desc"><u>\</u></span>本身，你也得用<span class="regex"><font color="#ff0000">\\</font></span>.</p>
<p>例如：<span class="regex"><font color="#ff0000">www\.unibetter\.com</font></span>匹配<span class="desc"><u>www.unibetter.com</u></span>，<span class="regex"><font color="#ff0000">c:\\windows</font></span>匹配<span class="desc"><u>c:\windows</u></span>,<span class="regex"><font color="#ff0000">2\^8</font></span>匹配<span class="desc"><u>2^8</u></span>(通常这是2的8次方的书写方式)。</p>
<h2 id="h8">重复</h2>
<p>你已经看过了前面的<span class="code"><font color="#0000ff">*</font></span>,<span class="code"><font color="#0000ff">+</font></span>,<span class="code"><font color="#0000ff">{2}</font></span>,<span class="code"><font color="#0000ff">{5,12}</font></span>这几个匹配重复的方式了。下面是正则表达式中所有指定重复的方式：</p>
<p>
<table cellspacing="0">
    <caption>表2.常用的限定符</caption>
    <tbody>
        <tr>
            <th>代码/语法</th>
            <th>说明</th>
        </tr>
        <tr>
            <td><span class="code"><font color="#0000ff">*</font></span></td>
            <td><span class="desc"><u>重复零次或更多次</u></span></td>
        </tr>
        <tr>
            <td><span class="code"><font color="#0000ff">+</font></span></td>
            <td><span class="desc"><u>重复一次或更多次</u></span></td>
        </tr>
        <tr>
            <td><span class="code"><font color="#0000ff">?</font></span></td>
            <td><span class="desc"><u>重复零次或一次</u></span></td>
        </tr>
        <tr>
            <td><span class="code"><font color="#0000ff">{n}</font></span></td>
            <td><span class="desc"><u>重复n次</u></span></td>
        </tr>
        <tr>
            <td><span class="code"><font color="#0000ff">{n,}</font></span></td>
            <td><span class="desc"><u>重复n次或更多次</u></span></td>
        </tr>
        <tr>
            <td><span class="code"><font color="#0000ff">{n,m}</font></span></td>
            <td><span class="desc"><u>重复n到m次</u></span></td>
        </tr>
    </tbody>
</table>
</p>
<p>下面是一些使用重复的例子：</p>
<p><span class="regex"><font color="#ff0000">Windows\d+</font></span>匹配<span class="desc"><u>Windows后面跟1个或更多数字</u></span></p>
<p><span class="regex"><font color="#ff0000">13\d{9}</font></span>匹配<span class="desc"><u>以13后面跟9个数字(中国的手机号)</u></span></p>
<p><span class="regex"><font color="#ff0000">^\w+</font></span>匹配<span class="desc"><u>一行的第一个单词(或整个字符串的第一个单词，具体匹配哪个意思得看选项设置)</u></span></p>
<h2 id="h9">字符类</h2>
<p>要想查找数字，字母或数字，空白是很简单的，因为已经有了对应这些字符集的元字符，但是如果你想匹配没有预定义元字符的字符集比如元音字母(a,e,i,o,u),怎么办？</p>
<p>很简单，你只需要在中括号里列出它们就行了，像<span class="regex"><font color="#ff0000">[aeiou]</font></span>就匹配<span class="desc"><u>任何一个元音字母</u></span>，<span class="regex"><font color="#ff0000">[.?!]</font></span>匹配<span class="desc"><u>标点符号(.或?或!)</u></span>(英文语句通常只以这三个标点结束)。注意，我们不需要写成[\.\?!]。</p>
<p>我们也可以轻松地指定一个字符<span class="name"><strong>范围</strong></span>，像<span class="regex"><font color="#ff0000">[0-9]</font></span>代表的含意与<span class="regex"><font color="#ff0000">\d</font></span>就是完全一致的：<span class="desc"><u>一位数字</u></span>，同理<span class="regex"><font color="#ff0000">[a-z0-9A-Z_]</font></span>也完全等同于<span class="code"><font color="#0000ff">\w</font></span>（如果只考虑英文的话）。</p>
<p>下面是一个更复杂的表达式：<span class="regex"><font color="#ff0000">\(?0\d{2}[) -]?\d{8}</font></span>。</p>
<p>这个表达式可以匹配<span class="desc"><u>几种格式的电话号码</u></span>，像<span class="string"><em>(010)88886666</em></span>，或<span class="string"><em>022-22334455</em></span>，或<span class="string"><em>02912345678</em></span>等。我们对它进行一些分析吧：首先是一个转义字符<span class="part"><font color="#008000">\(</font></span>,它能出现0次或1次(<span class="part"><font color="#008000">?</font></span>),然后是一个<span class="part"><font color="#008000">0</font></span>，后面跟着2个数字(<span class="part"><font color="#008000">{2}</font></span>)，然后是<span class="part"><font color="#008000">)</font></span>或<span class="part"><font color="#008000">-</font></span>或<span class="part"><font color="#008000">空格</font></span>中的一个，它出现1次或不出现(<span class="part"><font color="#008000">?</font></span>)，最后是8个数字(<span class="part"><font color="#008000">\d{8}</font></span>)。不幸的是，它也能匹配<span class="string"><em>010)12345678</em></span>或<span class="string"><em>(022-87654321</em></span>这样的&#8220;不正确&#8221;的格式。要解决这个问题，请在本教程的下面查找答案。</p>
<h2 id="h10">反义</h2>
<p>有时需要查找不属于某个能简单定义的字符类的字符。比如想查找除了数字以外，其它任意字符都行的情况，这时需要用到<span class="name"><strong>反义</strong></span>：</p>
<p>
<table cellspacing="0">
    <caption>表3.常用的反义代码</caption>
    <tbody>
        <tr>
            <th>代码/语法</th>
            <th>说明</th>
        </tr>
        <tr>
            <td><span class="code"><font color="#0000ff">\W</font></span></td>
            <td><span class="desc"><u>匹配任意不是字母，数字，下划线，汉字的字符</u></span></td>
        </tr>
        <tr>
            <td><span class="code"><font color="#0000ff">\S</font></span></td>
            <td><span class="desc"><u>匹配任意不是空白符的字符</u></span></td>
        </tr>
        <tr>
            <td><span class="code"><font color="#0000ff">\D</font></span></td>
            <td><span class="desc"><u>匹配任意非数字的字符</u></span></td>
        </tr>
        <tr>
            <td><span class="code"><font color="#0000ff">\B</font></span></td>
            <td><span class="desc"><u>匹配不是单词开头或结束的位置</u></span></td>
        </tr>
        <tr>
            <td><span class="code"><font color="#0000ff">[^x]</font></span></td>
            <td><span class="desc"><u>匹配除了x以外的任意字符</u></span></td>
        </tr>
        <tr>
            <td><span class="code"><font color="#0000ff">[^aeiou]</font></span></td>
            <td><span class="desc"><u>匹配除了aeiou这几个字母以外的任意字符</u></span></td>
        </tr>
    </tbody>
</table>
</p>
<p>例子：<span class="regex"><font color="#ff0000">\S+</font></span>匹配<span class="desc"><u>不包含空白符的字符串</u></span>。</p>
<p><span class="regex"><font color="#ff0000">&lt;a[^&gt;]+&gt;</font></span>匹配<span class="desc"><u>用尖括号括起来的以a开头的字符串</u></span>。</p>
<h2 id="h11">替换</h2>
<p>好了，现在终于到了解决3位或4位区号问题的时间了。正则表达式里的<span class="name"><strong>替换</strong></span>指的是有几种规则，如果满足其中任意一种规则都应该当成匹配，具体方法是用<span class="code"><font color="#0000ff">|</font></span>把不同的规则分隔开。听不明白？没关系，看例子：</p>
<p><span class="regex"><font color="#ff0000">0\d{2}-\d{8}|0\d{3}-\d{7}</font></span>这个表达式能<span class="desc"><u>匹配两种以连字号分隔的电话号码：一种是三位区号，8位本地号(如010-12345678)，一种是4位区号，7位本地号(0376-2233445)</u></span>。</p>
<p><span class="regex"><font color="#ff0000">\(0\d{2}\)[- ]?\d{8}|0\d{2}[- ]?\d{8}</font></span>这个表达式<span class="desc"><u>匹配3位区号的电话号码，其中区号可以用小括号括起来，也可以不用，区号与本地号间可以用连字号或空格间隔，也可以没有间隔</u></span>。你可以试试用替换|把这个表达式扩展成也支持4位区号的。</p>
<p><span class="regex"><font color="#ff0000">\d{5}-\d{4}|\d{5}</font></span>这个表达式用于匹配美国的邮政编码。美国邮编的规则是5位数字，或者用连字号间隔的9位数字。之所以要给出这个例子是因为它能说明一个问题：<strong>使用替换时，顺序是很重要的</strong>。如果你把它改成<span class="regex"><font color="#ff0000">\d{5}|\d{5}-\d{4}</font></span>的话，那么就只会匹配5位的邮编(以及9位邮编的前5位)。原因是匹配替换时，将会从左到右地测试每个分枝条件，如果满足了某个分枝的话，就不会去管其它的替换条件了。</p>
<p><span class="regex"><font color="#ff0000">Windows98|Windows2000|WindosXP</font></span>这个例子是为了告诉你替换不仅仅能用于两种规则，也能用于更多种规则。</p>
<h2 id="h12">分组</h2>
<p>我们已经提到了怎么重复单个字符（直接在字符后面加上限定符就行了）；但如果想要重复一个字符串又该怎么办？你可以用小括号来指定<span class="name"><strong>子表达式</strong></span>(也叫做<span class="name"><strong>分组</strong></span>)，然后你就可以指定这个子表达式的重复次数了，你也可以对子表达式进行其它一些操作(后面会有介绍)。</p>
<p><span class="regex"><font color="#ff0000">(\d{1,3}\.){3}\d{1,3}</font></span>是一个<span class="desc"><u>简单的IP地址匹配</u></span>表达式。要理解这个表达式，请按下列顺序分析它：<span class="part"><font color="#008000">\d{1,3}</font></span>匹配<span class="desc"><u>1到3位的数字</u></span>，<span class="part"><font color="#008000">(\d{1,3}\.}{3}</font></span>匹配<span class="desc"><u>三位数字加上一个英文句号(这个整体也就是这个<span class="name"><strong>分组</strong></span>)重复3次</u></span>，最后再加上<span class="desc"><u>一个一到三位的数字</u></span>(<span class="part"><font color="#008000">\d{1,3}</font></span>)。</p>
<p>不幸的是，它也将匹配<span class="string"><em>256.300.888.999</em></span>这种不可能存在的IP地址(IP地址中每个数字都不能大于255)。如果能使用算术比较的话，或许能简单地解决这个问题，但是正则表达式中并不提供关于数学的任何功能，所以只能使用冗长的分组，选择，字符类来描述一个正确的IP地址：<span class="regex"><font color="#ff0000">((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)</font></span>。</p>
<p>理解这个表达式的关键是理解<span class="part"><font color="#008000">2[0-4]\d|25[0-5]|[01]?\d\d?</font></span>，这里我就不细说了，你自己应该能分析得出来它的意义。</p>
<h2 id="h13">后向引用</h2>
<p>使用小括号指定一个子表达式后，<strong>匹配这个子表达式的文本</strong>可以在表达式或其它程序中作进一步的处理。默认情况下，每个分组会自动拥有一个<span class="name"><strong>组号</strong></span>，规则是：从左向右，以分组的左括号为标志，第一个出现的分组的组号为1，第二个为2，以此类推。</p>
<p><span class="name"><strong>后向引用</strong></span>用于重复搜索前面某个分组匹配的文本。例如，<span class="part"><font color="#008000">\1</font></span>代表<span class="desc"><u>分组1匹配的文本</u></span>。难以理解？请看示例：</p>
<p><span class="regex"><font color="#ff0000">\b(\w+)\b\s+\1\b</font></span>可以用来匹配<span class="desc"><u>重复的单词</u></span>，像<span class="string"><em>go go</em></span>, <span class="string"><em>kitty kitty</em></span>。首先是<span class="desc"><u>一个单词</u></span>，也就是<span class="desc"><u>单词开始处和结束处之间的多于一个的字母或数字</u></span>(<span class="part"><font color="#008000">\b(\w+)\b</font></span>)，然后是<span class="desc"><u>1个或几个空白符</u></span>(<span class="part"><font color="#008000">\s+</font></span>，最后是<span class="desc"><u>前面匹配的那个单词</u></span>(<span class="part"><font color="#008000">\1</font></span>)。</p>
<p>你也可以自己指定子表达式的组号或<span class="name"><strong>组名</strong></span>。要指定一个子表达式的组名，请使用这样的语法：<span class="code"><font color="#0000ff">(?&lt;Word&gt;\w+)</font></span>,这样就把<span class="part"><font color="#008000">\w+</font></span>的组名指定为<span class="part"><font color="#008000">Word</font></span>了。要反向引用这个分组<span class="name"><strong>捕获</strong></span>的内容，你可以使用<span class="code"><font color="#0000ff">\k&lt;Word&gt;</font></span>,所以上一个例子也可以写成这样：<span class="regex"><font color="#ff0000">\b(?&lt;Word&gt;\w+)\b\s*\k&lt;Word&gt;\b</font></span>。</p>
<p>使用小括号的时候，还有很多特定用途的语法。下面列出了最常用的一些：</p>
<p>
<table cellspacing="0">
    <caption>表4.分组语法</caption>
    <tbody>
        <tr>
            <th colspan="2">捕获</th>
        </tr>
        <tr>
            <td><span class="code"><font color="#0000ff">(exp)</font></span></td>
            <td><span class="desc"><u>匹配exp,并捕获文本到自动命名的组里</u></span></td>
        </tr>
        <tr>
            <td><span class="code"><font color="#0000ff">(?&lt;name&gt;exp)</font></span></td>
            <td><span class="desc"><u>匹配exp,并捕获文本到名称为name的组里，也可以写成(?'name'exp)</u></span></td>
        </tr>
        <tr>
            <td><span class="code"><font color="#0000ff">(?:exp)</font></span></td>
            <td><span class="desc"><u>匹配exp,不捕获匹配的文本</u></span></td>
        </tr>
        <tr>
            <th colspan="2">位置指定</th>
        </tr>
        <tr>
            <td><span class="code"><font color="#0000ff">(?=exp)</font></span></td>
            <td><span class="desc"><u>匹配exp前面的位置</u></span></td>
        </tr>
        <tr>
            <td><span class="code"><font color="#0000ff">(?&lt;=exp)</font></span></td>
            <td><span class="desc"><u>匹配exp后面的位置</u></span></td>
        </tr>
        <tr>
            <td><span class="code"><font color="#0000ff">(?!exp)</font></span></td>
            <td><span class="desc"><u>匹配后面跟的不是exp的位置</u></span></td>
        </tr>
        <tr>
            <td><span class="code"><font color="#0000ff">(?&lt;!exp)</font></span></td>
            <td><span class="desc"><u>匹配前面不是exp的位置</u></span></td>
        </tr>
        <tr>
            <th colspan="2">注释</th>
        </tr>
        <tr>
            <td><span class="code"><font color="#0000ff">(?#comment)</font></span></td>
            <td><span class="desc"><u>这种类型的组不对正则表达式的处理产生任何影响，只是为了提供让人阅读注释</u></span></td>
        </tr>
    </tbody>
</table>
</p>
<p>我们已经讨论了前两种语法。第三个<span class="code"><font color="#0000ff">(?:exp)</font></span>不会改变正则表达式的处理方式，只是这样的组匹配的内容<span class="desc"><u>不会像前两种那样被捕获到某个组里面</u></span>。</p>
<h2 id="h14">位置指定</h2>
<p>接下来的四个用于查找在某些内容(但并不包括这些内容)之前或之后的东西，也就是说它们用于指定一个位置，就像<span class="code"><font color="#0000ff">\b</font></span>,<span class="code"><font color="#0000ff">^</font></span>,<span class="code"><font color="#0000ff">$</font></span>那样，因此它们也被称为<span class="name"><strong>零宽断言</strong></span>。最好还是拿例子来说明吧：</p>
<p><span class="code"><font color="#0000ff">(?=exp)</font></span>也叫<span class="name"><strong>零宽先行断言</strong></span>，它<span class="desc"><u>匹配文本中的某些位置，这些位置的后面能匹配给定的后缀exp</u></span>。比如<span class="regex"><font color="#ff0000">\b\w+(?=ing\b)</font></span>，匹配<span class="desc"><u>以ing结尾的单词的前面部分(除了ing以外的部分)</u></span>，如果在查找<span class="string"><em>I'm singing while you're dancing.</em></span>时，它会匹配<span class="desc"><u>sing</u></span>和<span class="desc"><u>danc</u></span>。</p>
<p><span class="code"><font color="#0000ff">(?&lt;=exp)</font></span>也叫<span class="name"><strong>零宽后行断言</strong></span>，它<span class="desc"><u>匹配文本中的某些位置，这些位置的前面能给定的前缀匹配exp</u></span>。比如<span class="regex"><font color="#ff0000">(?&lt;=\bre)\w+\b</font></span>会匹配<span class="desc"><u>以re开头的单词的后半部分(除了re以外的部分)</u></span>，例如在查找<span class="string"><em>reading a book</em></span>时，它匹配<span class="desc"><u>ading</u></span>。</p>
<p>假如你想要给一个很长的数字中每三位间加一个逗号(当然是从右边加起了)，你可以这样查找需要在前面和里面添加逗号的部分：<span class="regex"><font color="#ff0000">((?&lt;=\d)\d{3})*\b</font></span>。请仔细分析这个表达式，它可能不像你第一眼看出来的那么简单。</p>
<p>下面这个例子同时使用了前缀和后缀：<span class="regex"><font color="#ff0000">(?&lt;=\s)\d+(?=\s)</font></span>匹配<span class="desc"><u>以空白符间隔的数字(再次强调，不包括这些空白符)</u></span>。</p>
<h2 id="h15">负向位置指定</h2>
<p>前面我们提到过怎么查找<strong>不是某个字符或不在某个字符类里</strong>的字符的方法(反义)。但是如果我们只是想要<strong>确保某个字符没有出现，但并不想去匹配它</strong>时怎么办？例如，如果我们想查找这样的单词--它里面出现了字母q,但是q后面跟的不是字母u,我们可以尝试这样：</p>
<p><span class="regex"><font color="#ff0000">\b\w*q[^u]\w*\b</font></span>匹配<span class="desc"><u>包含<strong>后面不是字母u的字母q</strong>的单词</u></span>。但是如果多做测试(或者你思维足够敏锐，直接就观察出来了)，你会发现，如果q出现在单词的结尾的话，像<strong>Iraq</strong>,<strong>Benq</strong>，这个表达式就会出错。这是因为<span class="part"><font color="#008000">[^u]</font></span>总是匹配一个字符，所以如果q是单词的最后一个字符的话，后面的<span class="part"><font color="#008000">[^u]</font></span>将会匹配q后面的单词分隔符(可能是空格，或者是句号或其它的什么)，后面的<span class="part"><font color="#008000">\w+\b</font></span>将会匹配下一个单词，于是<span class="regex"><font color="#ff0000">\b\w*q[^u]\w*\b</font></span>就能匹配整个<span class="string"><em>Iraq fighting</em></span>。<span class="name"><strong>负向位置指定</strong></span>能解决这样的问题，因为它只匹配一个位置，并不<strong>消费</strong>任何字符。现在，我们可以这样来解决这个问题：<span class="regex"><font color="#ff0000">\b\w*q(?!u)\w*\b</font></span>。</p>
<p><span class="name"><strong>零宽负向先行断言</strong></span><span class="code"><font color="#0000ff">(?!exp)</font></span>，只会匹配<span class="desc"><u><span class="name"><strong>后缀</strong></span>exp不存在的位置</u></span>。<span class="regex"><font color="#ff0000">\d{3}(?!\d)</font></span>匹配<span class="desc"><u>三位数字，而且这三位数字的后面不能是数字</u></span>。</p>
<p>同理，我们可以用<span class="code"><font color="#0000ff">(?&lt;!exp)</font></span>,<span class="name"><strong>零宽负向后行断言</strong></span>来查找<span class="desc"><u>前缀exp不存在的位置</u></span>：<span class="regex"><font color="#ff0000">(?&lt;![a-z])\d{7}</font></span>匹配<span class="desc"><u>前面不是小写字母的七位数字</u></span>(实验时发现错误？注意你的&#8220;区分大小写&#8221;先项是否选中)。</p>
<p>一个更复杂的例子：<span class="regex"><font color="#ff0000">(?&lt;=&lt;(\w+)&gt;).*(?=&lt;\/\1&gt;)</font></span>匹配<span class="desc"><u>不包含属性的简单HTML标签内里的内容</u></span>。<span class="code"><font color="#0000ff">(&lt;?(\w+)&gt;)</font></span>指定了这样的前缀：<span class="desc"><u>被尖括号括起来的单词</u></span>(比如可能是&lt;b&gt;)，然后是<span class="part"><font color="#008000">.*</font></span>(任意的字符串),最后是一个后缀<span class="part"><font color="#008000">(?=&lt;\/\1&gt;)</font></span>。注意后缀里的<span class="part"><font color="#008000">\/</font></span>，它用到了前面提过的字符转义；<span class="part"><font color="#008000">\1</font></span>则是一个反向引用，引用的正是<span class="desc"><u>捕获的第一组</u></span>，前面的<span class="part"><font color="#008000">(\w+)</font></span>匹配的内容，这样如果前缀实际上是&lt;b&gt;的话，后缀就是&lt;/b&gt;了。整个表达式匹配的是&lt;b&gt;和&lt;/b&gt;之间的内容(再次提醒，不包括前缀和后缀本身)。</p>
<h2 id="h16">注释</h2>
<p>小括号的另一种用途是能过语法<span class="code"><font color="#0000ff">(?#comment)</font></span>来包含注释。例如：<span class="regex"><font color="#ff0000">2[0-4]\d(?#200-249)|25[0-5](?#250-255)|[01]?\d\d?(?#0-199)</font></span>。</p>
<p>要包含注释的话，最好是启用&#8220;忽略模式里的空白符&#8221;选项，这样在编写表达式时能任意的添加空格，Tab，换行，而实际使用时这些都将被忽略。启用这个选项后，在#后面到这一行结束的所有文本都将被当成注释忽略掉。</p>
<p>例如，我们可以前面的一个表达式写成这样：</p>
<pre>      (?&lt;=    # 查找前缀，但不包含它<br />
&lt;(\w+)&gt; # 查找尖括号括起来的字母或数字(标签)<br />
)       # 前缀结束<br />
.*      # 匹配任意文本<br />
(?=     # 查找后缀，但不包含它<br />
&lt;\/\1&gt;  # 查找尖括号括起来的内容：前面是一个"/"，后面是先前捕获的标签<br />
)       # 后缀结束    </pre>
<h2 id="h17">贪婪与懒惰</h2>
<p>当正则表达式中包含能接受重复的限定符(指定数量的代码，例如*,{5,12}等)时，通常的行为是（在使整个表达式能得到匹配的前提下）匹配<strong>尽可能多</strong>的字符。考虑这个表达式：<span class="regex"><font color="#ff0000">a.*b</font></span>，它将会匹配<span class="desc"><u>最长的以a开始，以b结束的字符串</u></span>。如果用它来搜索<span class="string"><em>aabab</em></span>的话，它会匹配整个字符串<span class="desc"><u>aabab</u></span>。这被称为<span class="name"><strong>贪婪</strong></span>匹配。</p>
<p>有时，我们更需要<span class="name"><strong>懒惰</strong></span>匹配，也就是匹配<strong>尽可能少</strong>的字符。前面给出的限定符都可以被转化为懒惰匹配模式，只要在它后面加上一个问号<span class="code"><font color="#0000ff">?</font></span>。这样<span class="regex"><font color="#ff0000">.*?</font></span>就意味着<span class="desc"><u>匹配任意数量的重复，但是在能使整个匹配成功的前提下使用最少的重复</u></span>。现在看看懒惰版的例子吧：</p>
<p><span class="regex"><font color="#ff0000">a.*?b</font></span>匹配<span class="desc"><u>最短的，以a开始，以b结束的字符串</u></span>。如果把它应用于<span class="string"><em>aabab</em></span>的话，它会匹配<span class="desc"><u>aab</u></span>和<span class="desc"><u>ab</u></span>（为什么第一个匹配是aab而不是ab？简单地说，最先开始的区配最有最大的优先权——The Match That Begins Earliest Wins）。</p>
<p>
<table cellspacing="0">
    <caption>表5.懒惰限定符</caption>
    <tbody>
        <tr>
            <td><span class="code"><font color="#0000ff">*?</font></span></td>
            <td><span class="desc"><u>重复任意次，但尽可能少重复</u></span></td>
        </tr>
        <tr>
            <td><span class="code"><font color="#0000ff">+?</font></span></td>
            <td><span class="desc"><u>重复1次或更多次，但尽可能少重复</u></span></td>
        </tr>
        <tr>
            <td><span class="code"><font color="#0000ff">??</font></span></td>
            <td><span class="desc"><u>重复0次或1次，但尽可能少重复</u></span></td>
        </tr>
        <tr>
            <td><span class="code"><font color="#0000ff">{n,m}?</font></span></td>
            <td><span class="desc"><u>重复n到m次，但尽可能少重复</u></span></td>
        </tr>
        <tr>
            <td><span class="code"><font color="#0000ff">{n,}?</font></span></td>
            <td><span class="desc"><u>重复n次以上，但尽可能少重复</u></span></td>
        </tr>
    </tbody>
</table>
</p>
<h2 id="h18">平衡组</h2>
<p>如果想要匹配可嵌套的层次性结构的话，就得使用平衡组了。举个例子吧，如何把&#8220;xx &lt;aa &lt;bbb&gt; &lt;bbb&gt; aa&gt; yy&#8221;这样的字符串里，最长的括号内的内容捕获出来？</p>
<p>这里需要用到以下的语法构造：</p>
<ul>
    <li><span class="code"><font color="#0000ff">(?&lt;group&gt;)</font></span> 把捕获的内容命名为group,并压入堆栈 </li>
    <li><span class="code"><font color="#0000ff">(?&lt;-group&gt;)</font></span> 从堆栈上弹出最后压入堆栈的名为group的捕获内容，如果堆栈本来为空，则本分组的匹配失败 </li>
    <li><span class="code"><font color="#0000ff">(?(group)yes|no)</font></span> 如果堆栈上存在以名为group的捕获内容的话，继续匹配yes部分的表达式，否则继续匹配no部分 </li>
    <li><span class="code"><font color="#0000ff">(?!)</font></span> 零宽负向先行断言，由于没有后缀表达式，试图匹配总是失败 </li>
</ul>
<p>如果你不是一个程序员（或者你是一个对堆栈的概念不熟的程序员），你就这样理解上面的三种语法吧：第一个就是在黑板上写一个（或再写一个）"group"，第二个就是从黑板上擦掉一个"group"，第三个就是看黑板上写的还有没有"group"，如果有就继续匹配yes部分，否则就匹配no部分。</p>
<p>我们需要做的是每碰到了左括号，就在黑板上写一个"group"，每碰到一个右括号，就擦掉一个，到了最后就看看黑板上还有没有－如果有那就证明左括号比右括号多，那匹配就应该失败（为了能看得更清楚一点，我用了(?'group')的语法）：</p>
<pre>&lt;                         #最外层的左括号<br />
[^&lt;&gt;]*                #最外层的左括号后面的不是括号的内容<br />
(<br />
(<br />
(?'Open'&lt;)    #碰到了左括号，在黑板上写一个"Open"<br />
[^&lt;&gt;&gt;]*       #匹配左括号后面的不是括号的内容<br />
)+<br />
(<br />
(?'-Open'&gt;)   #碰到了右括号，擦掉一个"Open"<br />
[^&lt;&gt;]*        #匹配右括号后面不是括号的内容<br />
)+<br />
)*<br />
(?(Open)(?!)) #在遇到最外层的右括号前面，判断黑板上还有没有没擦掉的"Open"；如果还有，则匹配失败<br />
&gt;                         #最外层的右括号</pre>
<h2 id="h19">还有些什么东西没提到</h2>
<p>我已经描述了构造正则表达式的大量元素，还有一些我没有提到的东西。下面是未提到的元素的列表，包含语法和简单的说明。你可以在网上找到更详细的参考资料来学习它们--当你需要用到它们的时候。如果你安装了MSDN Library,你也可以在里面找到关于.net下正则表达式详细的文档。</p>
<p>
<table cellspacing="0">
    <caption>表6.尚未详细讨论的语法</caption>
    <tbody>
        <tr>
            <td><span class="code"><font color="#0000ff">\a</font></span></td>
            <td><span class="desc"><u>报警字符(打印它的效果是电脑嘀一声)</u></span></td>
        </tr>
        <tr>
            <td><span class="code"><font color="#0000ff">\b</font></span></td>
            <td><span class="desc"><u>通常是单词分界位置，但如果在字符类里使用代表退格</u></span></td>
        </tr>
        <tr>
            <td><span class="code"><font color="#0000ff">\t</font></span></td>
            <td><span class="desc"><u>制表符，Tab</u></span></td>
        </tr>
        <tr>
            <td><span class="code"><font color="#0000ff">\r</font></span></td>
            <td><span class="desc"><u>回车</u></span></td>
        </tr>
        <tr>
            <td><span class="code"><font color="#0000ff">\v</font></span></td>
            <td><span class="desc"><u>竖向制表符</u></span></td>
        </tr>
        <tr>
            <td><span class="code"><font color="#0000ff">\f</font></span></td>
            <td><span class="desc"><u>换页符</u></span></td>
        </tr>
        <tr>
            <td><span class="code"><font color="#0000ff">\n</font></span></td>
            <td><span class="desc"><u>换行符</u></span></td>
        </tr>
        <tr>
            <td><span class="code"><font color="#0000ff">\e</font></span></td>
            <td><span class="desc"><u>Escape</u></span></td>
        </tr>
        <tr>
            <td><span class="code"><font color="#0000ff">\0nn</font></span></td>
            <td><span class="desc"><u>ASCII代码中八进制代码为nn的字符</u></span></td>
        </tr>
        <tr>
            <td><span class="code"><font color="#0000ff">\xnn</font></span></td>
            <td><span class="desc"><u>ASCII代码中十六进制代码为nn的字符</u></span></td>
        </tr>
        <tr>
            <td><span class="code"><font color="#0000ff">\unnnn</font></span></td>
            <td><span class="desc"><u>Unicode代码中十六进制代码为nnnn的字符</u></span></td>
        </tr>
        <tr>
            <td><span class="code"><font color="#0000ff">\cN</font></span></td>
            <td><span class="desc"><u>ASCII控制字符。比如\cC代表Ctrl+C</u></span></td>
        </tr>
        <tr>
            <td><span class="code"><font color="#0000ff">\A</font></span></td>
            <td><span class="desc"><u>字符串开头(类似^，但不受处理多行选项的影响)</u></span></td>
        </tr>
        <tr>
            <td><span class="code"><font color="#0000ff">\Z</font></span></td>
            <td><span class="desc"><u>字符串结尾或行尾(不受处理多行选项的影响)</u></span></td>
        </tr>
        <tr>
            <td><span class="code"><font color="#0000ff">\z</font></span></td>
            <td><span class="desc"><u>字符串结尾(类似$，但不受处理多行选项的影响)</u></span></td>
        </tr>
        <tr>
            <td><span class="code"><font color="#0000ff">\G</font></span></td>
            <td><span class="desc"><u>当前搜索的开头</u></span></td>
        </tr>
        <tr>
            <td><span class="code"><font color="#0000ff">\p{name}</font></span></td>
            <td><span class="desc"><u>Unicode中命名为name的字符类，例如\p{IsGreek}</u></span></td>
        </tr>
        <tr>
            <td><span class="code"><font color="#0000ff">(?&gt;exp)</font></span></td>
            <td><span class="desc"><u>贪婪子表达式</u></span></td>
        </tr>
        <tr>
            <td><span class="code"><font color="#0000ff">(?&lt;x&gt;-&lt;y&gt;exp)</font></span></td>
            <td><span class="desc"><u>平衡组</u></span></td>
        </tr>
        <tr>
            <td><span class="code"><font color="#0000ff">(?im-nsx:exp)</font></span></td>
            <td><span class="desc"><u>在子表达式exp中改变处理选项</u></span></td>
        </tr>
        <tr>
            <td><span class="code"><font color="#0000ff">(?im-nsx)</font></span></td>
            <td><span class="desc"><u>为表达式后面的部分改变处理选项</u></span></td>
        </tr>
        <tr>
            <td><span class="code"><font color="#0000ff">(?(exp)yes|no)</font></span></td>
            <td><span class="desc"><u>把exp当作零宽正向先行断言，如果在这个位置能匹配，使用yes作为此组的表达式；否则使用no</u></span></td>
        </tr>
        <tr>
            <td><span class="code"><font color="#0000ff">(?(exp)yes)</font></span></td>
            <td><span class="desc"><u>同上，只是使用空表达式作为no</u></span></td>
        </tr>
        <tr>
            <td><span class="code"><font color="#0000ff">(?(name)yes|no)</font></span></td>
            <td><span class="desc"><u>如果命名为name的组捕获到了内容，使用yes作为表达式；否则使用no</u></span></td>
        </tr>
        <tr>
            <td><span class="code"><font color="#0000ff">(?(name)yes)</font></span></td>
            <td><span class="desc"><u>同上，只是使用空表达式作为no</u></span></td>
        </tr>
    </tbody>
</table>
</p>
<h2 id="reference">一些我认为你可能已经知道的术语的参考</h2>
<dl>
<dt>字符 </dt>
<dd>程序处理文字时最基本的单位，可能是字母，数字，标点符号，空格，换行符，汉字等等。 </dd>
<dt>字符串 </dt>
<dd>0个或更多个字符的序列。 </dd>
<dt>文本 </dt>
<dd>文字，字符串。 </dd>
<dt>匹配 </dt>
<dd>符合规则，检验是否符合规则，符合规则的部分。 </dd></dl>
<h2 id="h21">网上的资源及本文参考文献</h2>
<ul>
    <li><a href="http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/jscript7/html/jsreconintroductiontoregularexpressions.asp">微软的正则表达式教程</a> </li>
    <li><a href="http://www.regular-expressions.info/">专业的正则表达式教学网站(英文)</a> </li>
    <li><a href="http://weblogs.asp.net/whaggard/archive/2005/02/20/377025.aspx">关于.Net下的平衡组的详细讨论（英文）</a> </li>
    <li><a href="http://www.oreilly.com/catalog/regex2/">Mastering Regular Expressions (Second Edition)</a> </li>
</ul>
<h2 id="h22">第二版更新说明</h2>
<ul>
    <li>修正了几个细节上的错误和不准确的地方 </li>
    <li>增加了对处理中文时的一些说明 </li>
    <li>更改了几个术语的翻译（采用了MSDN的翻译方式） </li>
    <li>增加了平衡组的介绍 </li>
    <li>放弃了对The Regulator的介绍，改用Regex Tester </li>
</ul>
<p>Updated on: 2006-10-12</p>
<img src ="http://www.cnblogs.com/dajianshi/aggbug/957559.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47986/" target="_blank">网易澄清:与暴雪合资公司仅提供技术支持</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>升级到IE7.0引起的问题</title><link>http://www.cnblogs.com/dajianshi/archive/2007/09/27/907743.html</link><dc:creator>大剑师</dc:creator><author>大剑师</author><pubDate>Thu, 27 Sep 2007 03:20:00 GMT</pubDate><guid>http://www.cnblogs.com/dajianshi/archive/2007/09/27/907743.html</guid><wfw:comment>http://www.cnblogs.com/dajianshi/comments/907743.html</wfw:comment><comments>http://www.cnblogs.com/dajianshi/archive/2007/09/27/907743.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/dajianshi/comments/commentRss/907743.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/dajianshi/services/trackbacks/907743.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 我们的web应用一般都是使用三行的布局header+content+footer，其中header部分当然在顶部，footer部分紧靠底部，内容部分大小正好填充满浏览器的当前高度，内容溢出后中间部分产生滚动条。正如大家周知的CSS兼容原因，只能以高js脚本实现。可是浏览器升级到IE7后，不能正常显示了，经调试发现原来document.body.clientHeight的值在IE7中变得很奇怪，使页面中第一个Div的高度，而不是原来的可用页面的高度了！不知到是不是IE7的一个Bug。经调试发现发现document.documentElement.offsetHeight可以使用，所以调整了脚本，显示恢复正常。希望对遇到同样问题的人有用。<br />
<img src ="http://www.cnblogs.com/dajianshi/aggbug/907743.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47985/" target="_blank">杰克逊悼念仪式或成史上最大规模Web活动</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>ClickOnce使用体会</title><link>http://www.cnblogs.com/dajianshi/archive/2007/08/31/877065.html</link><dc:creator>大剑师</dc:creator><author>大剑师</author><pubDate>Fri, 31 Aug 2007 04:11:00 GMT</pubDate><guid>http://www.cnblogs.com/dajianshi/archive/2007/08/31/877065.html</guid><wfw:comment>http://www.cnblogs.com/dajianshi/comments/877065.html</wfw:comment><comments>http://www.cnblogs.com/dajianshi/archive/2007/08/31/877065.html#Feedback</comments><slash:comments>10</slash:comments><wfw:commentRss>http://www.cnblogs.com/dajianshi/comments/commentRss/877065.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/dajianshi/services/trackbacks/877065.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 由于很少写Winform的程序，所以net2.0发布后，对于ClickOnce这个新特性，一直只是听说过没用过。直到最近有个小程序使用winform开发，使用了Clickonce的发布方式，发现它远没有想象中好用。因此写下自己的一些心得，希望对没用过的人有点帮助。<br />
&nbsp;&nbsp;&nbsp; 一、ClickOnce的几个缺点：<br />
&nbsp;&nbsp;&nbsp; 1，没有单独的项目类型。<br />
&nbsp;&nbsp;&nbsp; 在&#8220;安装和部署&#8221;中没有这个项目类型，所以不能单见一个项目，只能在项目属性页的&#8220;发布&#8221;选项卡中使用，或者在项目节点的邮件菜单中直接启动向导使用。使用起来很不习惯。<br />
&nbsp;&nbsp;&nbsp; 2，可控制性太差。<br />
&nbsp;&nbsp;&nbsp; 尤其是包含的文件的下载状态，只有下载或不下载（需要时可以在程序中下载）。而且下载后的目录位置由FrameWork控制（在当前用户的目录中新添加了一个Apps目录Documents and Settings\Administrator\Local Settings\Apps），目录名是一大串，而且很多个目录，让人摸不着头脑，不知道这些目录的作用。<br />
&nbsp;&nbsp;&nbsp; 3，数据文件的位置很离奇。<br />
&nbsp;&nbsp;&nbsp; 如果程序中包含数据库文件，并且设置类型为数据文件，那么用户安装后的数据库文件被放到和程序不同的另外一个目录中，所以一定要注意这点。这将造成程序的不同分发方式，数据目录的位置是不同的，感觉很别扭。<br />
&nbsp;&nbsp;&nbsp; 4，数据文件的分发策略。<br />
&nbsp;&nbsp;&nbsp; 在ClickOnce的发布程序组选项中，有&#8220;数据文件&#8221;这一类型，可是我觉得微软的分发策略有问题，除了&#8220;自动将老版本的数据文件复制到新版本程序的数据目录中&#8221;这一特性外，其他的设定和别的文件类型一样，也就是说，如果地发布版本中的数据文件有变化，那么会自动下载并覆盖用户使用中的数据库文件，这对于涉及用户输入的程序来说简直是不可接受的！<br />
&nbsp;&nbsp;&nbsp; 5，发布的程序竟然不压缩！<br />
&nbsp;&nbsp;&nbsp; 这是我认为的ClickOnce发布中的最大缺点，发布的程序文件竟然不压缩，不打包，这对于大的程序来说简直是灾难，尤其国内的网络环境这麽差。另外，发布的文件是否添加&#8220;deploy&#8221;扩展名这个没用的设置竟然允许用户选择，简直很可笑，如果不加扩展名只会造成有些特殊的文件类型不能下载！<br />
&nbsp;&nbsp;&nbsp; 以上就是我发现我认为的几个缺点，很有可能是我使用的有问题，希望有达人斧正。<br />
&nbsp;&nbsp;&nbsp; 二、我总结的注意事项和小技巧：<br />
&nbsp;&nbsp;&nbsp; 1，数据库文件的目录。<br />
&nbsp;&nbsp;&nbsp; 我想大多数的应用程序都是离不开数据库的，对于.net的程序来说，Access的MDB或者SqlExpress数据库是我的选择。这里不得不说一下|DataDirectory|这个东东，详细请看我的另一随笔<a id="viewpost1_TitleUrl" href="../../dajianshi/archive/2007/07/06/808495.html">使用|DataDirectory| 的烦恼</a>。现在发现在Winform程序中，尤其是要使用ClickOnce发布方式，你的数据目录千万不能叫做&#8220;App_Data&#8221;,这是正是因为ClickOnce发布的文件不打包，目录结构也是原样设置的，而&#8220;App_data&#8221;在IIS中是个犯忌的目录名字，目录下的文件不论什么权限都是不能下载的！我可是试验了多次才醒悟的！<br />
&nbsp;&nbsp;&nbsp; 2，数据文件的分发。<br />
&nbsp;&nbsp;&nbsp; 由于上面提到的ClickOnce分发数据文件的缺陷,我设想了两种解决方案:由于微软设置是如果是数据文件,那末只能输入"必需"的文件组,所以两种方案中数据库文件都不能设置为数据文件,而是将类型设置为"包括".<br />
&nbsp;&nbsp;&nbsp; 第一种方案,为数据库文件建立一个单独的组,这样自动安装的时候就不会下载安装数据文件,可以在程序启动后,判断是否第一次运行,由于deploy.IsFirstRun的值,每次升级后也是True,所以还要判断一下数据目录中是否有文件(因为第一次下载数据文件后并存放到数据目录后,以后升级程序后,Framework会自动将旧的数据文件拷贝到新办程序的数据目录中).如果需要下载,那么就调用ApplicationDeployment.CurrentDeployment.DownloadFileGroup("Database");下载数据文件,下载完成后移动到数据目录中.<br />
&nbsp;&nbsp;&nbsp; 第二种方案,考虑有可能是通过光盘进行分发,所以是把数据文件设置为"必需"组,然后经过上面同样的判断,然后确定是把数据文件移动到数据目录还是删除.<br />
&nbsp;&nbsp;&nbsp; 目前我采用了第二种方案,不过由于ClickOnce分发不压缩打包,而数据库文件又比较大,所以每次升级都包括数据库文件有点浪费.<br />
&nbsp;&nbsp;&nbsp; 以上就是我使用ClickOnce的一点儿体会,欢迎大家拍砖.~_~<br />
&nbsp;&nbsp;&nbsp; <br />
<br />
<img src ="http://www.cnblogs.com/dajianshi/aggbug/877065.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47984/" target="_blank">《商业周刊》:Mozilla的志愿者开发模式被复制</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title> 在.NET中运行外部程序的3种方法[转贴]</title><link>http://www.cnblogs.com/dajianshi/archive/2007/07/19/823813.html</link><dc:creator>大剑师</dc:creator><author>大剑师</author><pubDate>Thu, 19 Jul 2007 05:35:00 GMT</pubDate><guid>http://www.cnblogs.com/dajianshi/archive/2007/07/19/823813.html</guid><wfw:comment>http://www.cnblogs.com/dajianshi/comments/823813.html</wfw:comment><comments>http://www.cnblogs.com/dajianshi/archive/2007/07/19/823813.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/dajianshi/comments/commentRss/823813.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/dajianshi/services/trackbacks/823813.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 在win32中有ShellExecute方法可以使我们启动外部的应用程序，在 .NET FrameWork 中我们可以使用Process类来完成类似的功能。
<p>Process在System.Diagnostics中，所以别忘了：</p>
<p>&nbsp;&nbsp;&nbsp; using System.Diagnostics;</p>
<p>1） 用Process的静态方法Start</p>
<p>//启动记事本</p>
<p>Process.Start("notepad.exe");</p>
<p>//启动记事本，并打开temp.txt文件 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Process.Start("notepad.exe",@"d:\temp.txt");</p>
<p>&nbsp;&nbsp;&nbsp; 此方法最简单，但功能有限</p>
<p>2) 用带有ProcessStartInfo参数的 Start方法</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ProcessStartInfo startInfo = new ProcessStartInfo("notepad.exe");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; startInfo.Arguments=@" d:\temp.txt ";</p>
<p>//启动时最小化</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; startInfo.WindowStyle = ProcessWindowStyle.Minimized;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; startInfo.Verb="open";</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Process.Start(startInfo);</p>
<p>3)实例化Process类</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Process process=new Process();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; process.StartInfo.FileName="notepad.exe";</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; process.StartInfo.Verb="open";</p>
<p>process.StartInfo.WindowStyle = ProcessWindowStyle.Minimized;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; process.StartInfo.Arguments=@" d:\temp.txt";</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; process.Start();</p>
<p>第2种方法和第3种方法差不多，他们的可选的功能就比较多了。</p>
<br><img src ="http://www.cnblogs.com/dajianshi/aggbug/823813.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47977/" target="_blank">Mono 的Virtual PC 虚拟机</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>使用|DataDirectory| 的烦恼</title><link>http://www.cnblogs.com/dajianshi/archive/2007/07/06/808495.html</link><dc:creator>大剑师</dc:creator><author>大剑师</author><pubDate>Fri, 06 Jul 2007 06:32:00 GMT</pubDate><guid>http://www.cnblogs.com/dajianshi/archive/2007/07/06/808495.html</guid><wfw:comment>http://www.cnblogs.com/dajianshi/comments/808495.html</wfw:comment><comments>http://www.cnblogs.com/dajianshi/archive/2007/07/06/808495.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/dajianshi/comments/commentRss/808495.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/dajianshi/services/trackbacks/808495.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; Ado.net2.0中新增加了一个MagicValue,可以在应用程序的配置文件的数据库链接串种使用|DataDirectory| ,例如<br><br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">connectionStrings</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">add&nbsp;name</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">ConnectionString</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;connectionString</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">data&nbsp;&nbsp;source=.\SQLEXPRESS;Integrated&nbsp;&nbsp;Security=SSPI;AttachDBFilename=|DataDirectory|data.mdf;User&nbsp;&nbsp;Instance=true</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;providerName</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">System.Data.SqlClient</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">/&gt;<br><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">connectionStrings</span><span style="COLOR: #000000">&gt;</span></span></div>
原来一直使用ASP.net开发web应用,asp.net 2.0特有几个特殊的文件夹App_Data就是其中一个,web应用的数据库大可以放在这个下面,一直工作的很好。......知道有一天开始写winform的程序，^_^，当然也想享受这种方便啦，可是发现Windows应用项目中不支持特殊的文件夹，根本没有这种东西！没关系咱自己建，还叫App_Data，运行发现数据库连不上，从错误信息中来看，原来Winform中把|DataDirectory|翻译成了程序启动目录apppath\bin\debug(或release),后面不带App_Data！数据库文件倒是自动复制倒了运行目录下（带着App_Data的目录）没关系，咱自己加上，把上面的链接串改成这样<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">connectionStrings</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">add&nbsp;name</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">ConnectionString</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;connectionString</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">data&nbsp;&nbsp;source=.\SQLEXPRESS;Integrated&nbsp;&nbsp;Security=SSPI;AttachDBFilename=|DataDirectory|App_Data\data.mdf;User&nbsp;&nbsp;Instance=true</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;providerName</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">System.Data.SqlClient</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000"><br>&nbsp;</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">connectionStrings</span><span style="COLOR: #000000">&gt;</span></div>
一运行，哈哈，链接成功了。试着录入几个数据，保存，ok没问题！退出，再运行，一看傻眼了，刚才录入的数据不见了！研究半天明白了，原来每次运行，.net都自动复制了一份数据库到运行目录，所以上次的数据就都丢失了！想到两个解决办法，1，把数据库的属性中的&#8220;复制到输出目录&#8221;设置为&#8220;不复制&#8221;，这样Debug和Release编译版本各用各的数据库，原始的数据库始终是空的！（好像也有用）2，链接到程序目录中的App_Data下的数据库。由于对第一种解决办法，自我感觉有点儿迷惑和Webform中的经验不一致，所以决定用第二种，Google了一下，有位我不认识的老外^_^给出了解决办法<a href="http://blogs.msdn.com/dataaccess/archive/2005/10/28/486273.aspx">http://blogs.msdn.com/dataaccess/archive/2005/10/28/486273.aspx</a>，就是在程序启动时，设置<font face="Courier New" color=#0000ff size=2>AppDomain.CurrentDomain.setData(&#8220;DataDirectory&#8221;,我的目录字符串);<span style="COLOR: #000000">Winform的程序那当然是在Main函数中了，废话不说了，我的代码如下<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;p&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;AppDomain.CurrentDomain.BaseDirectory;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(p.IndexOf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">\\bin\\</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)<br><img id=Codehighlighter1_90_275_Open_Image onclick="this.style.display='none'; Codehighlighter1_90_275_Open_Text.style.display='none'; Codehighlighter1_90_275_Closed_Image.style.display='inline'; Codehighlighter1_90_275_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_90_275_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_90_275_Closed_Text.style.display='none'; Codehighlighter1_90_275_Open_Image.style.display='inline'; Codehighlighter1_90_275_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_90_275_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_90_275_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(p.EndsWith(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">\\bin\\Debug\\</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">))<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;p.Replace(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">\\bin\\Debug</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">""</span><span style="COLOR: #000000">);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(p.EndsWith(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">\\bin\\Release\\</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">))<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;p.Replace(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">\\bin\\Release</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">""</span><span style="COLOR: #000000">);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">p.EndsWith(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">App_Data\\</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">))<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;p&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">App_Data\\</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AppDomain.CurrentDomain.SetData(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">DataDirectory</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;p);</span></div>
</span></font>思想就是去掉调试期间和生产期间的不同，这样要注意的是，发布程序的时候，数据库也要放到App_Data目录下面。
<img src ="http://www.cnblogs.com/dajianshi/aggbug/808495.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47970/" target="_blank">19岁天才黑客发布首个iPhone 3GS破解软件</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>自定义DataGridView列的设计期支持，自定义属性的保存！</title><link>http://www.cnblogs.com/dajianshi/archive/2007/06/26/796307.html</link><dc:creator>大剑师</dc:creator><author>大剑师</author><pubDate>Tue, 26 Jun 2007 06:41:00 GMT</pubDate><guid>http://www.cnblogs.com/dajianshi/archive/2007/06/26/796307.html</guid><wfw:comment>http://www.cnblogs.com/dajianshi/comments/796307.html</wfw:comment><comments>http://www.cnblogs.com/dajianshi/archive/2007/06/26/796307.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/dajianshi/comments/commentRss/796307.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/dajianshi/services/trackbacks/796307.html</trackback:ping><description><![CDATA[摘要: &nbsp;&nbsp;<a href='http://www.cnblogs.com/dajianshi/archive/2007/06/26/796307.html'>阅读全文</a><img src ="http://www.cnblogs.com/dajianshi/aggbug/796307.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47969/" target="_blank">新浪邮箱大本营粉墨登场！Sina.cn开放注册</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title> Javascript的IE和Firefox兼容性汇编[转帖.收藏]</title><link>http://www.cnblogs.com/dajianshi/archive/2006/11/26/573365.html</link><dc:creator>大剑师</dc:creator><author>大剑师</author><pubDate>Sun, 26 Nov 2006 15:05:00 GMT</pubDate><guid>http://www.cnblogs.com/dajianshi/archive/2006/11/26/573365.html</guid><wfw:comment>http://www.cnblogs.com/dajianshi/comments/573365.html</wfw:comment><comments>http://www.cnblogs.com/dajianshi/archive/2006/11/26/573365.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/dajianshi/comments/commentRss/573365.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/dajianshi/services/trackbacks/573365.html</trackback:ping><description><![CDATA[<span style="font-size: 12pt;"></span>
<h1 class="ContentTitle"><span style="font-size: 12pt;"><span style="font-weight: normal;">最近作浏览器兼容性方面的工作，发现此篇文章，太好了，转帖收藏了</span><strong><br><span style="font-size: 18pt;"> Javascript的IE和Firefox兼容性汇编</span></strong></span> </h1>
<h2 class="ContentAuthor">作者:<span style="color: #ff0000;">yaosansi</span> 日期:2006-11-14</h2>
<div id="logPanel" class="Content-body Content-bodyLink">
<p>1. document.form.item 问题<br>&nbsp;&nbsp;&nbsp; (1)现有问题：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 现有代码中存在许多 document.formName.item("itemName") 这样的语句，不能在 MF 下运行<br>&nbsp;&nbsp;&nbsp; (2)解决方法：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 改用 document.formName.elements["elementName"]<br>&nbsp;&nbsp;&nbsp; (3)其它<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 参见 2</p>
<p>2. 集合类对象问题<br>&nbsp;&nbsp;&nbsp; (1)现有问题：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 现有代码中许多集合类对象取用时使用 ()，IE 能接受，MF 不能。<br>&nbsp;&nbsp;&nbsp; (2)解决方法：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 改用 [] 作为下标运算。如：document.forms("formName") 改为 document.forms["formName"]。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 又如：document.getElementsByName("inputName")(1) 改为 document.getElementsByName("inputName")[1]<br>&nbsp;&nbsp;&nbsp; (3)其它</p>
<p>3. window.event<br>&nbsp;&nbsp;&nbsp; (1)现有问题：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 使用 window.event 无法在 MF 上运行<br>&nbsp;&nbsp;&nbsp; (2)解决方法：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MF 的 event 只能在事件发生的现场使用，此问题暂无法解决。可以这样变通：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 原代码(可在IE中运行)：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type="button" name="someButton" value="提交" onclick="javascript:gotoSubmit()"/&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;script language="javascript"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; function gotoSubmit() {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alert(window.event);&nbsp;&nbsp;&nbsp; // use window.event<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/script&gt;</p>
<br>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 新代码(可在IE和MF中运行)：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type="button" name="someButton" value="提交" onclick="javascript:gotoSubmit(event)"/&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;script language="javascript"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; function gotoSubmit(evt) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; evt = evt ? evt : (window.event ? window.event : null);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alert(evt);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // use evt<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/script&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 此外，如果新代码中第一行不改，与老代码一样的话(即 gotoSubmit 调用没有给参数)，则仍然只能在IE中运行，但不会出错。所以，这种方案 tpl 部分仍与老代码兼容。<br></p>
<hr style="width: 100%; height: 2px;"><span style="color: #ff0030; font-weight: bold;">对原文的补充</span>：<span style="font-size: 10pt;"><span style="font-size: 12pt; font-family: Courier;">事件的对象，在IE中是<font color="#d56000">window</font>.<font color="#d56000">event.srcElement</font>，在Firefox中是<font color="#d56000">event.target</font>，而在Opera中则两者都支持。还是用例子来说明。</span></span> <br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><img id="Code_Closed_Image_115510" onclick="this.style.display='none'; code_closed_text_115510.style.display="'none';" code_open_image_115510.style.display="'inline';" code_open_text_115510.style.display="'inline';"" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top" height="16" width="11"><img id="Code_Open_Image_115510" style="display: none;" onclick="this.style.display='none'; code_open_text_115510.style.display="'none';" code_closed_image_115510.style.display="'inline';" code_closed_text_115510.style.display="'inline';"" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top" height="16" width="11"><span id="Code_Closed_Text_115510" style="border: 1px solid #808080; background-color: #ffffff;">event.srcElement/event.target</span><span id="Code_Open_Text_115510" style="display: none;"><br><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">//***********************************<br></span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">HTML</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">HEAD</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">TITLE</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">&nbsp;event的跨浏览器测试&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">TITLE</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">SCRIPT&nbsp;</span><span style="color: #ff0000;">LANGUAGE</span><span style="color: #0000ff;">="JavaScript"</span><span style="color: #0000ff;">&gt;</span><span style="background-color: #f5f5f5; color: #000000;"><br></span><span style="background-color: #f5f5f5; color: #000000;">&lt;!--</span><span style="background-color: #f5f5f5; color: #000000;"><br></span><span style="background-color: #f5f5f5; color: #008000;">//</span><span style="background-color: #f5f5f5; color: #008000;">Firefox中在写关于event的函数的时候，必须把event对象作为参数传递给函数，这样才能使用event对象</span><span style="background-color: #f5f5f5; color: #008000;"><br></span><span style="background-color: #f5f5f5; color: #0000ff;">function</span><span style="background-color: #f5f5f5; color: #000000;">&nbsp;doTestEvent(&nbsp;evt&nbsp;)<br>{<br>&nbsp;&nbsp;</span><span style="background-color: #f5f5f5; color: #008000;">//</span><span style="background-color: #f5f5f5; color: #008000;">如果是IE/Opera，我们就用&nbsp;srcElement&nbsp;来获取触发事件的对象</span><span style="background-color: #f5f5f5; color: #008000;"><br></span><span style="background-color: #f5f5f5; color: #000000;">&nbsp;&nbsp;</span><span style="background-color: #f5f5f5; color: #008000;">//</span><span style="background-color: #f5f5f5; color: #008000;">如果是Firefox，我们就用&nbsp;target&nbsp;来获取触发事件的对象</span><span style="background-color: #f5f5f5; color: #008000;"><br></span><span style="background-color: #f5f5f5; color: #000000;">&nbsp;&nbsp;</span><span style="background-color: #f5f5f5; color: #0000ff;">var</span><span style="background-color: #f5f5f5; color: #000000;">&nbsp;src&nbsp;</span><span style="background-color: #f5f5f5; color: #000000;">=</span><span style="background-color: #f5f5f5; color: #000000;">&nbsp;evt.srcElement&nbsp;</span><span style="background-color: #f5f5f5; color: #000000;">?</span><span style="background-color: #f5f5f5; color: #000000;">&nbsp;evt.srcElement&nbsp;:&nbsp;evt.target;<br>&nbsp;&nbsp;alert(&nbsp;src.value&nbsp;);<br>}<br></span><span style="background-color: #f5f5f5; color: #008000;">//</span><span style="background-color: #f5f5f5; color: #008000;">--&gt;</span><span style="background-color: #f5f5f5; color: #008000;"><br></span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">script</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">head</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">body</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br><br></span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">form&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="frmtest"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">input&nbsp;</span><span style="color: #ff0000;">type</span><span style="color: #0000ff;">="button"</span><span style="color: #ff0000;">&nbsp;value</span><span style="color: #0000ff;">="event&nbsp;测试"</span><span style="color: #ff0000;">&nbsp;onclick</span><span style="color: #0000ff;">="doTestEvent(event);"</span><span style="color: #ff0000;">&nbsp;name</span><span style="color: #0000ff;">="bttest"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">form</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br><br></span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">body</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">html</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">&nbsp;</span></span></div>
<font color="#0000ff"></font><br><font color="#008000"><font color="#008080">//***********************************</font></font>
<br><hr style="width: 100%; height: 2px;"><br>
<p><br></p>
<p>4. HTML 对象的 id 作为对象名的问题<br>&nbsp;&nbsp;&nbsp; (1)现有问题<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在 IE 中，HTML 对象的 ID 可以作为 document 的下属对象变量名直接使用。在 MF 中不能。<br>&nbsp;&nbsp;&nbsp; (2)解决方法<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用 getElementById("idName") 代替 idName 作为对象变量使用。</p>
<br>
<p>5. 用idName字符串取得对象的问题<br>&nbsp;&nbsp;&nbsp; (1)现有问题<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在IE中，利用 eval(idName) 可以取得 id 为 idName 的 HTML 对象，在MF 中不能。<br>&nbsp;&nbsp;&nbsp; (2)解决方法<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用 getElementById(idName) 代替 eval(idName)。</p>
<p>6. 变量名与某 HTML 对象 id 相同的问题<br>&nbsp;&nbsp;&nbsp; (1)现有问题<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在 MF 中，因为对象 id 不作为 HTML 对象的名称，所以可以使用与 HTML 对象 id 相同的变量名，IE 中不能。<br>&nbsp;&nbsp;&nbsp; (2)解决方法<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在声明变量时，一律加上 var ，以避免歧义，这样在 IE 中亦可正常运行。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 此外，最好不要取与 HTML 对象 id 相同的变量名，以减少错误。<br>&nbsp;&nbsp;&nbsp; (3)其它<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 参见 问题4</p>
<p>7. event.x 与 event.y 问题<br>&nbsp;&nbsp;&nbsp; (1)现有问题<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在IE 中，event 对象有 x, y 属性，MF中没有。<br>&nbsp;&nbsp;&nbsp; (2)解决方法<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在MF中，与event.x 等效的是 event.pageX。但event.pageX IE中没有。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 故采用 event.clientX 代替 event.x。在IE 中也有这个变量。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; event.clientX 与 event.pageX 有微妙的差别（当整个页面有滚动条的时候），不过大多数时候是等效的。</p>
<br>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果要完全一样，可以稍麻烦些：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mX = event.x ? event.x : event.pageX;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 然后用 mX 代替 event.x<br>&nbsp;&nbsp;&nbsp; (3)其它<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; event.layerX 在 IE 与 MF 中都有，具体意义有无差别尚未试验。</p>
<br>
<p>8. 关于frame<br>&nbsp;&nbsp; (1)现有问题<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在 IE中 可以用window.testFrame取得该frame，mf中不行<br>&nbsp;&nbsp; (2)解决方法<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在frame的使用方面mf和ie的最主要的区别是：<br>如果在frame标签中书写了以下属性：<br>&lt;frame src="/xx.htm" id="frameId" name="frameName" /&gt;<br>那么ie可以通过id或者name访问这个frame对应的window对象<br>而mf只可以通过name来访问这个frame对应的window对象<br>例如如果上述frame标签写在最上层的window里面的htm里面，那么可以这样访问<br>ie： window.top.frameId或者window.top.frameName来访问这个window对象<br>mf： 只能这样window.top.frameName来访问这个window对象</p>
<p>另外，在mf和ie中都可以使用window.top.document.getElementById("frameId")来访问frame标签<br>并且可以通过window.top.document.getElementById("testFrame").src = 'xx.htm'来切换frame的内容<br>也都可以通过window.top.frameName.location = 'xx.htm'来切换frame的内容<br>关于frame和window的描述可以参见bbs的&#8216;window与frame&#8217;文章<br>以及/test/js/test_frame/目录下面的测试<br>----adun 2004.12.09修改</p>
<p>9. 在mf中，自己定义的属性必须getAttribute()取得<br>10.在mf中没有&nbsp; parentElement parement.children&nbsp; 而用<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parentNode parentNode.childNodes<br>&nbsp;&nbsp; childNodes的下标的含义在IE和MF中不同，MF使用DOM规范，childNodes中会插入空白文本节点。<br>&nbsp; 一般可以通过node.getElementsByTagName()来回避这个问题。<br>&nbsp;&nbsp; 当html中节点缺失时，IE和MF对parentNode的解释不同，例如<br>&nbsp;&nbsp; &lt;form&gt;<br>&nbsp;&nbsp; &lt;table&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input/&gt;<br>&nbsp;&nbsp; &lt;/table&gt;<br>&nbsp;&nbsp; &lt;/form&gt;<br>&nbsp;&nbsp; MF中input.parentNode的值为form, 而IE中input.parentNode的值为空节点</p>
<br>
<p>&nbsp; MF中节点没有removeNode方法，必须使用如下方法 node.parentNode.removeChild(node)</p>
<p>11.const 问题<br>&nbsp; (1)现有问题:<br>&nbsp;&nbsp;&nbsp;&nbsp; 在 IE 中不能使用 const 关键字。如 const constVar = 32; 在IE中这是语法错误。<br>&nbsp; (2)解决方法:<br>&nbsp;&nbsp;&nbsp;&nbsp; 不使用 const ，以 var 代替。</p>
<p>12. body 对象<br>&nbsp;&nbsp; MF的body在body标签没有被浏览器完全读入之前就存在，而IE则必须在body完全被读入之后才存在</p>
<p>13. url encoding<br>在js中如果书写url就直接写&amp;不要写&amp;amp;例如var url = 'xx.jsp?objectName=xx&amp;amp;objectEvent=xxx';<br>frm.action = url那么很有可能url不会被正常显示以至于参数没有正确的传到服务器<br>一般会服务器报错参数没有找到<br>当然如果是在tpl中例外，因为tpl中符合xml规范，要求&amp;书写为&amp;amp;<br>一般MF无法识别js中的&amp;amp;</p>
<p><br>14. nodeName 和 tagName 问题<br>&nbsp; (1)现有问题：<br>&nbsp;&nbsp;&nbsp;&nbsp; 在MF中，所有节点均有 nodeName 值，但 textNode 没有 tagName 值。在 IE 中，nodeName 的使用好象<br>&nbsp;&nbsp;&nbsp;&nbsp; 有问题（具体情况没有测试，但我的IE已经死了好几次）。<br>&nbsp; (2)解决方法：<br>&nbsp;&nbsp;&nbsp;&nbsp; 使用 tagName，但应检测其是否为空。</p>
<p>15. 元素属性<br>&nbsp;&nbsp; IE下 input.type属性为只读，但是MF下可以修改</p>
<p><br>16. document.getElementsByName() 和 document.all[name] 的问题<br>&nbsp; (1)现有问题：<br>&nbsp;&nbsp;&nbsp;&nbsp; 在 IE 中，getElementsByName()、document.all[name] 均不能用来取得 div 元素（是否还有其它不能取的元素还不知道）。<br></p>
<br>
</div>
<img src="http://www.yaosansi.com/blog/images/From.gif" style="margin: 0px 2px -4px 0px;" alt=""><strong> 文章来自:</strong>  <a href="http://www.yaosansi.com/blog/" target="_blank">互联网</a><br>
<img src="http://www.yaosansi.com/blog/images/icon_trackback.gif" style="margin: 0px 2px -4px 0px;" alt=""><strong> 引用通告地址:</strong>  <a href="http://www.yaosansi.com/blog/trackback.asp?tbID=941" target="_blank">http://www.yaosansi.com/blog/trackback.asp?tbID=941</a><br>
<img src="http://www.yaosansi.com/blog/images/tag.gif" style="margin: 4px 2px -4px 0px;" alt=""><strong> Tags:</strong>  <a href="http://www.yaosansi.com/blog/default.asp?tag=JavaScript">JavaScript</a><a href="http://technorati.com/tag/JavaScript" rel="tag" style="display: none;">JavaScript</a> <a href="http://www.yaosansi.com/blog/default.asp?tag=IE">IE</a><a href="http://technorati.com/tag/IE" rel="tag" style="display: none;">IE</a> <a href="http://www.yaosansi.com/blog/default.asp?tag=Firefox">Firefox</a><a href="http://technorati.com/tag/Firefox" rel="tag" style="display: none;">Firefox</a> <a href="http://www.yaosansi.com/blog/default.asp?tag=%E5%85%BC%E5%AE%B9%E6%80%A7">兼容性</a><a href="http://technorati.com/tag/%E5%85%BC%E5%AE%B9%E6%80%A7" rel="tag" style="display: none;">兼容性</a>
<br> <img src ="http://www.cnblogs.com/dajianshi/aggbug/573365.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47968/" target="_blank">IE市场份额首次跌破60%</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item></channel></rss>