Asp.Net中用流操作文件
byte[] bytes = File.ReadAllBytes(@"c:\BorlandDelphi7.zip"); File.WriteAllBytes(@"c:\a.zip", bytes);
有用过这种方式来读取文件的。
这种方式的弊端在于,先是把文件整个读取出来,放入内存,然后再写入硬盘。如果文件太大,而且内存不够大的话,有可能造成死机现象,而且速度相对来说比较慢。
流操作:
什么是流,通俗来说就是读一点写一点,而且这个一点,是可以控制的,我可以让他一次读取1M或者10M或者100M都可以。
控制读取文件大小 这个就是缓冲区,设置缓冲区不可以太小,当然也不可以太大,适当就好,太小了会频繁读写硬盘,对硬盘损害加大,太大了也会拖慢速度。设置适当就可以。
个人建议8M开始。
static void Main(string[] args) { using (FileStream outStream = new FileStream(@"c:\a.zip", FileMode.Create))//通过FileMode.Create标明是写入流 { using (FileStream fs = new FileStream(@"c:\BorlandDelphi7.zip",FileMode.Open))//通过FileMode.Open标明是读取流 { ////Read返回值表示实际读了多少内容 //fs.Read(bytes, 0, bytes.Length); byte[] bytes = new byte[1024 * 1024 * 4];//缓冲区的大小。就是一次读取多少内容 //缓冲区太小的话速度慢,伤硬盘 //如果Read返回值大于0,说明还没有读完 int readBytes;//实际读出的长度 //Read和SqlDataReader的Read一样,是每次Read指针后移 //错误:int readBytes=fs.Read(....) //while(readBytes>0) //第二个参数offset表示当前位置的偏移量,一般都传0 while ((readBytes = fs.Read(bytes, 0, bytes.Length)) > 0) { //因为最后一次可能没有把bytes读慢 //所以把实际读取的数量做为第三个参数 outStream.Write(bytes, 0, readBytes); //Thread.Sleep(1);//线程挂起时间 } } }
如果相直观的看到流,可以在读取一个缓冲区大小文件后让线程挂起一下,然后刷新文件夹来查看此时写入的文件的大小的变化。
线程挂起
Thread.Sleep(1);
欢迎加入.net技术交流群
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。