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技术交流群


Asp.Net中用流操作文件,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。