C#FileStream复制大文件

<p>即每次复制文件的一小段,以节省总内存开销。当然,本机复制也可以采用.NET内部的System.IO.File.Copy方法。</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="" lang="EN-US"><span style=""> </span><span style="color: gray;">///</span><span style="color: green;"> </span><span style="color: gray;"><summary></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="" lang="EN-US"><span style=""> </span><span style="color: gray;">///</span><span style="color: green;"> </span></span><span style="">复制文件<span lang="EN-US"></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="" lang="EN-US"><span style=""> </span><span style="color: gray;">///</span><span style="color: green;"> </span><span style="color: gray;"></summary></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="" lang="EN-US"><span style=""> </span><span style="color: gray;">///</span><span style="color: green;"> </span><span style="color: gray;"><param name="fromFile"></span></span><span style="">要复制的文件</span><span style="" lang="EN-US"></param></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="" lang="EN-US"><span style=""> </span><span style="color: gray;">///</span><span style="color: green;"> </span><span style="color: gray;"><param name="toFile"></span></span><span style="">要保存的位置</span><span style="" lang="EN-US"></param></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="" lang="EN-US"><span style=""> </span><span style="color: gray;">///</span><span style="color: green;"> </span><span style="color: gray;"><param name="lengthEachTime"></span></span><span style="">每次复制的长度</span><span style="" lang="EN-US"></param></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="" lang="EN-US"><span style=""> </span><span style="color: blue;">private</span> <span style="color: blue;">void</span> <span style="color: #010001;">CopyFile</span>(<span style="color: blue;">string</span> <span style="color: #010001;">fromFile</span>, <span style="color: blue;">string</span> <span style="color: #010001;">toFile</span>, <span style="color: blue;">int</span> <span style="color: #010001;">lengthEachTime</span>)</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="" lang="EN-US"><span style=""> </span>{</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="" lang="EN-US"><span style=""> </span><span style="color: #2b91af;">FileStream</span> <span style="color: #010001;">fileToCopy</span> = <span style="color: blue;">new</span> <span style="color: #2b91af;">FileStream</span>(<span style="color: #010001;">fromFile</span>, <span style="color: #2b91af;">FileMode</span>.<span style="color: #010001;">Open</span>, <span style="color: #2b91af;">FileAccess</span>.<span style="color: #010001;">Read</span>);</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="" lang="EN-US"><span style=""> </span><span style="color: #2b91af;">FileStream</span> <span style="color: #010001;">copyToFile</span> = <span style="color: blue;">new</span> <span style="color: #2b91af;">FileStream</span>(<span style="color: #010001;">toFile</span>, <span style="color: #2b91af;">FileMode</span>.<span style="color: #010001;">Append</span>, <span style="color: #2b91af;">FileAccess</span>.<span style="color: #010001;">Write</span>);</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="" lang="EN-US"><span style=""> </span><span style="color: blue;">int</span> <span style="color: #010001;">lengthToCopy</span>;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="" lang="EN-US"><span style=""> </span><span style="color: blue;">if</span> (<span style="color: #010001;">lengthEachTime</span> < <span style="color: #010001;">fileToCopy</span>.<span style="color: #010001;">Length</span>)<span style="color: green;">//</span></span><span style="">如果分段拷贝,即每次拷贝内容小于文件总长度<span lang="EN-US"></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="" lang="EN-US"><span style=""> </span>{</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="" lang="EN-US"><span style=""> </span><span style="color: blue;">byte</span>[] <span style="color: #010001;">buffer</span> = <span style="color: blue;">new</span> <span style="color: blue;">byte</span>[<span style="color: #010001;">lengthEachTime</span>];</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="" lang="EN-US"><span style=""> </span><span style="color: blue;">int</span> <span style="color: #010001;">copied</span> = 0;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="" lang="EN-US"><span style=""> </span><span style="color: blue;">while</span> (<span style="color: #010001;">copied</span> <= ((<span style="color: blue;">int</span>)<span style="color: #010001;">fileToCopy</span>.<span style="color: #010001;">Length</span> - <span style="color: #010001;">lengthEachTime</span>))<span style="color: green;">//</span></span><span style="">拷贝主体部分<span lang="EN-US"></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="" lang="EN-US"><span style=""> </span>{</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="" lang="EN-US"><span style=""> </span><span style="color: #010001;">lengthToCopy</span> = <span style="color: #010001;">fileToCopy</span>.<span style="color: #010001;">Read</span>(<span style="color: #010001;">buffer</span>, 0, <span style="color: #010001;">lengthEachTime</span>);</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="" lang="EN-US"><span style=""> </span><span style="color: #010001;">fileToCopy</span>.<span style="color: #010001;">Flush</span>();</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="" lang="EN-US"><span style=""> </span><span style="color: #010001;">copyToFile</span>.<span style="color: #010001;">Write</span>(<span style="color: #010001;">buffer</span>, 0, <span style="color: #010001;">lengthEachTime</span>);</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="" lang="EN-US"><span style=""> </span><span style="color: #010001;">copyToFile</span>.<span style="color: #010001;">Flush</span>();</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="" lang="EN-US"><span style=""> </span><span style="color: #010001;">copyToFile</span>.<span style="color: #010001;">Position</span> = <span style="color: #010001;">fileToCopy</span>.<span style="color: #010001;">Position</span>;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="" lang="EN-US"><span style=""> </span><span style="color: #010001;">copied</span> += <span style="color: #010001;">lengthToCopy</span>;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="" lang="EN-US"><span style=""> </span>}</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="" lang="EN-US"><span style=""> </span><span style="color: blue;">int</span> <span style="color: #010001;">left</span> = (<span style="color: blue;">int</span>)<span style="color: #010001;">fileToCopy</span>.<span style="color: #010001;">Length</span> - <span style="color: #010001;">copied</span>;<span style="color: green;">//</span></span><span style="">拷贝剩余部分<span lang="EN-US"></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="" lang="EN-US"><span style=""> </span><span style="color: #010001;">lengthToCopy</span> = <span style="color: #010001;">fileToCopy</span>.<span style="color: #010001;">Read</span>(<span style="color: #010001;">buffer</span>, 0, <span style="color: #010001;">left</span>);</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="" lang="EN-US"><span style=""> </span><span style="color: #010001;">fileToCopy</span>.<span style="color: #010001;">Flush</span>();</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="" lang="EN-US"><span style=""> </span><span style="color: #010001;">copyToFile</span>.<span style="color: #010001;">Write</span>(<span style="color: #010001;">buffer</span>, 0, <span style="color: #010001;">left</span>);</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="" lang="EN-US"><span style=""> </span><span style="color: #010001;">copyToFile</span>.<span style="color: #010001;">Flush</span>();</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="" lang="EN-US"><span style=""> </span>}</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="" lang="EN-US"><span style=""> </span><span style="color: blue;">else</span><span style="color: green;">//</span></span><span style="">如果整体拷贝,即每次拷贝内容大于文件总长度<span lang="EN-US"></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="" lang="EN-US"><span style=""> </span>{</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="" lang="EN-US"><span style=""> </span><span style="color: blue;">byte</span>[] <span style="color: #010001;">buffer</span> = <span style="color: blue;">new</span> <span style="color: blue;">byte</span>[<span style="color: #010001;">fileToCopy</span>.<span style="color: #010001;">Length</span>];</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="" lang="EN-US"><span style=""> </span><span style="color: #010001;">fileToCopy</span>.<span style="color: #010001;">Read</span>(<span style="color: #010001;">buffer</span>,0,(<span style="color: blue;">int</span>)<span style="color: #010001;">fileToCopy</span>.<span style="color: #010001;">Length</span>);</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="" lang="EN-US"><span style=""> </span><span style="color: #010001;">fileToCopy</span>.<span style="color: #010001;">Flush</span>();</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="" lang="EN-US"><span style=""> </span><span style="color: #010001;">copyToFile</span>.<span style="color: #010001;">Write</span>(<span style="color: #010001;">buffer</span>, 0, (<span style="color: blue;">int</span>)<span style="color: #010001;">fileToCopy</span>.<span style="color: #010001;">Length</span>);</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="" lang="EN-US"><span style=""> </span><span style="color: #010001;">copyToFile</span>.<span style="color: #010001;">Flush</span>();</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="" lang="EN-US"><span style=""> </span>}</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="" lang="EN-US"><span style=""> </span><span style="color: #010001;">fileToCopy</span>.<span style="color: #010001;">Close</span>();</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="" lang="EN-US"><span style=""> </span><span style="color: #010001;">copyToFile</span>.<span style="color: #010001;">Close</span>();</span></p>
<p><span style="" lang="EN-US"><span style=""> </span>}</span></p>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值