在处理Stream型态时常会使用到Stream.Write这个方法,每次都会有种疑问就是,大多数的处理都是要将Buffer整个写入,為何偏偏每次都要将索引带0,长度带為Buffer的大小呢?另外在处理Stream时,若要显示其处理进度,是否能有更為简单的方法?这边将我為了解决这些问题所写的扩充方法整裡如下:
02 |
using System.Reflection; |
03 |
using System.ComponentModel; |
07 |
public static class StreamExtension |
09 |
public static void Write(this Stream targetStream, byte[] buffer) |
11 |
if (!targetStream.CanWrite) |
12 |
throw new ArgumentException("targetStream", "Unwritable stream"); |
14 |
targetStream.Write(buffer, 0, buffer.Length); |
17 |
public static void Write(this Stream targetStream, Stream sourceStream) |
19 |
if (!targetStream.CanWrite) |
20 |
throw new ArgumentException("targetStream", "Unwritable stream"); |
22 |
if (sourceStream == null) |
23 |
throw new ArgumentNullException("sourceStream"); |
25 |
if (!sourceStream.CanRead) |
26 |
throw new ArgumentException("sourceStream", "Unreadable stream"); |
28 |
targetStream.Write(sourceStream, 1024, null); |
31 |
public static void Write(this Stream targetStream, Stream sourceStream, int bufferSize, Action<object, System.ComponentModel.ProgressChangedEventArgs> progressChangedCallBack) |
33 |
if (sourceStream == null) |
34 |
throw new ArgumentNullException("sourceStream"); |
36 |
if (!sourceStream.CanRead) |
37 |
throw new ArgumentException("sourceStream", "Unreadable stream"); |
39 |
if (!targetStream.CanWrite) |
40 |
throw new ArgumentException("targetStream", "Unwritable stream"); |
42 |
if (bufferSize < 1024) |
43 |
throw new ArgumentOutOfRangeException("bufferSize", "Must bigger than 1024"); |
45 |
byte[] buffer = new byte[bufferSize]; |
48 |
int readByteCount = 0; |
51 |
while ((readByteCount = sourceStream.Read(buffer, 0, bufferSize)) > 0) |
53 |
targetStream.Write(buffer, 0, readByteCount); |
55 |
if (progressChangedCallBack != null) |
57 |
offset += readByteCount; |
59 |
var currentPercent = (int)(((double)offset) / sourceStream.Length * 100); |
60 |
if (currentPercent == percent) |
63 |
percent = currentPercent; |
64 |
progressChangedCallBack(targetStream, new System.ComponentModel.ProgressChangedEventArgs(percent, null)); |
使用上Write方法會多三個多載版本,一個是將buffer整個寫入、一個是將stream的內容整個讀出並寫入、一個則是用來寫入整個stream內容,並可帶入處理的Buffer大小,與處理進度回報的Callback,用以處理進度的顯示。
1 |
targetStream.Write(buffer); |
2 |
targetStream.Write(sourceStream); |
3 |
targetStream.Write(sourceStream, 1024, (sender, e) => { Console.WriteLine(e.ProgressPercentage.ToString ()); }); |
這邊針對進度處理的擴充方法示範個較為詳細的範例,這邊我會讀取C槽下的test.data檔案,檔案大小為5MB多,開啟後將其寫入c槽下的test_copy.data。處理的buffer大小為1024,每當在處理時偵測到進度改變時會顯示出當前處理的進度比例。
02 |
using System.Collections.Generic; |
07 |
namespace ConsoleApplication11 |
11 |
static void Main(string[] args) |
13 |
using (FileStream targetStream = File .Create (@"c:\test_copy.dat")) |
15 |
using (FileStream sourceStream= File.Open (@"c:\test.dat", FileMode.Open)) |
17 |
targetStream.Write(sourceStream, 1024, (sender, e) => { Console.WriteLine(e.ProgressPercentage.ToString()); }); |
運行結果如下:

- [C#] Extension Method 扩展方法
当我们引用第三方的DLL.或者Visual Studio自己的库的时候,或许会发现这样的一个情况,如果这个类型有一个XX的方法就好了.这时候我们可以用到扩展方法,是我们的代码更加灵活和高效. 这里我举 ...
- 动态linq表达式新方法,Dynamic LINQ Extension Method
Remember those old posts on Dynamic LINQ? You are probably aware that Microsoft has made its impleme ...
- Extension Method[下篇]
四.Extension Method的本质 通过上面一节的介绍,我们知道了在C#中如何去定义一个Extension Method:它是定义在一个Static class中的.第一个Parameter标 ...
- Extension Method[上篇]
在C#3.0中,引入了一些列新的特性,比如: Implicitly typed local variable, Extension method,Lambda expression, Object i ...
- C# Note21: 扩展方法(Extension Method)及其应用
前言 今天在开会时提到的一个概念,入职3个多月多注重在项目中使用C#的编程知识,一直没有很认真地过一遍C#的全部语法,当我们新人被问及是否了解Extension Method时,一时之间竟不能很通俗准 ...
- [译文]c#扩展方法(Extension Method In C#)
原文链接: https://www.codeproject.com/Tips/709310/Extension-Method-In-Csharp 介绍 扩展方法是C# 3.0引入的新特性.扩展方法使你 ...
- C#编译问题'System.Collections.Generic.IEnumerable' does not contain a definition for 'Where' and no extension method 'Where' accepting a first argument
'System.Collections.Generic.IEnumerable<string>' does not contain a definiti ...
- Swift protocol extension method is called instead of method implemented in subclass
Swift protocol extension method is called instead of method implemented in subclass protocol MyProto ...
- Extension method for type
扩展其实真的很简单 msdn是这样规定扩展方法的:"扩展方法被定义为静态方法,但它们是通过实例方法语法进行调用的. 它们的第一个参数指定该方法作用于哪个类型,并且该参数以 this 修饰符为 ...
随机推荐
- 关于ASP .Net Core 引用dll 一
一:ASP.Net Core 引用dll文件,不可以直接引用,必须在NuGet中引用才行. 二:如果想引用自己的dll文件,则需要注册NeGet账号,获取到API Key 才行,还需要下载NuGet安 ...
- 自给自足:动手打造html5俄罗斯方块
时间:凌晨2:36 历时:两晚+半个下午 代码:约300行 这两天发烧,头痛脑壳昏的,没想到竟然还能有动力去做小游戏,其实这不是我第一次想要弄个俄罗斯方块,前几个星期的时候就尝试着去弄一个,然后被凌乱 ...
- PHP获取真实的网络IP
function get_client_ip() { $ip = $_SERVER['REMOTE_ADDR']; if (isset($_SERVER['HTTP_CLIENT_IP']) & ...
- PHP不显示报错了怎么办~
php.ini里设置吧, 找到 display_errors, 设置成on, error_reporting = E_ALL
- MYSQL 部分事务
MYSQL 中通过 savepoint 的方式来实现只提交事务的一部分. step 1 : savepoint savepoint_name;. 做标记 step 2 :rollbak to save ...
- eclipse android sdk javadoc
sdk 的函数不提示帮助信息 查了下是现在adt版本没有doc文件夹,拷贝了早期的版本docs过来 其他具体操作如下:http://blog.csdn.net/lyh7736362/article/d ...
- poj 1860 (Bellman_Ford判断正环)
题意:给出n种货币,m中交换关系,给出两种货币汇率和手续费,求能不能通过货币间的兑换使财富增加. 用Bellman_Ford 求出是否有正环,如果有的话就可以无限水松弛,财富可以无限增加. #incl ...
- 我使用过的Linux命令之date - 显示、修改系统日期时间
原文地址:http://www.cnblogs.com/diyunpeng/archive/2011/11/20/2256538.html 用途说明 ate命令可以用来显示和修改系统日期时间,注意不是 ...
- magento中取不同store中的产品数据
$products = Mage::getResourceModel('catalog/product_collection') ->setStoreId( ...
- xCode6制作动态及静态Framework(转)
原文:http://years.im/Home/Article/detail/id/52.html 相关推荐:http://www.cocoachina.com/ios/20150127/11022. ...