C# FileStream复制大文件功能

FileStream缓冲读取和写入可以提高性能。每次复制文件的一小段,以节省总内存开销。当然,本机复制也可以采用.NET内部的System.IO.File.Copy方法。

FileStream读取文件的时候,是先讲流放入内存,经Flash()方法后将内存中(缓冲中)的数据写入文件。如果文件非常大,势必消耗性能。特封装在FileHelper中以备不时之需。强制类型转换,如果文件很大,比如4G,就会出现溢出的情况,复制的结果字节丢失严重,导致复制文件和源文件大小不一样。这里修改的代码如下:

public static class FileHelper
  {
    /// <summary>
    /// 复制大文件
    /// </summary>
    /// <param name="fromPath">源文件的路径</param>
    /// <param name="toPath">文件保存的路径</param>
    /// <param name="eachReadLength">每次读取的长度</param>
    /// <returns>是否复制成功</returns>
    public static bool CopyFile(string fromPath, string toPath, int eachReadLength)
    {
      //将源文件 读取成文件流
      FileStream fromFile = new FileStream(fromPath, FileMode.Open, FileAccess.Read);
      //已追加的方式 写入文件流
      FileStream toFile = new FileStream(toPath, FileMode.Append, FileAccess.Write);
      //实际读取的文件长度
      int toCopyLength = 0;
      //如果每次读取的长度小于 源文件的长度 分段读取
      if (eachReadLength < fromFile.Length)
      {
        byte[] buffer = new byte[eachReadLength];
        long copied = 0;
        while (copied <= fromFile.Length - eachReadLength)
        {
          toCopyLength = fromFile.Read(buffer, 0, eachReadLength);
          fromFile.Flush();
          toFile.Write(buffer, 0, eachReadLength);
          toFile.Flush();
          //流的当前位置
          toFile.Position = fromFile.Position;
          copied += toCopyLength;
        }
        int left = (int)(fromFile.Length - copied);
        toCopyLength = fromFile.Read(buffer, 0, left);
        fromFile.Flush();
        toFile.Write(buffer, 0, left);
        toFile.Flush();

      }
      else
      {
        //如果每次拷贝的文件长度大于源文件的长度 则将实际文件长度直接拷贝
        byte[] buffer = new byte[fromFile.Length];
        fromFile.Read(buffer, 0, buffer.Length);
        fromFile.Flush();
        toFile.Write(buffer, 0, buffer.Length);
        toFile.Flush();

      }
      fromFile.Close();
      toFile.Close();
      return true;
    }
  }

测试代码:

class Program
  {
    static void Main(string[] args)
    {

      Stopwatch watch = new Stopwatch();
      watch.Start();
      if (FileHelper.CopyFile(@"D:\安装文件\新建文件夹\SQLSVRENT_2008R2_CHS.iso", @"F:\SQLSVRENT_2008R2_CHS.iso", 1024 * 1024 * 5))
      {
        watch.Stop();
        Console.WriteLine("拷贝完成,耗时:" + watch.Elapsed.Seconds + "秒");
      }
      Console.Read();
    }
  }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C# FileStream实现大文件复制

    FileStream缓冲读取和写入可以提高性能.FileStream读取文件的时候,是先将流放入内存,经Flush()方法后将内存中(缓冲中)的数据写入文件.如果文件非常大,势必消耗性能.特封装在FileHelper中以备不时之需. 参考文章:C# FileStream复制大文件.将该文章中提供的代码稍作修改,原文中进行了强制类型转换,如果文件很大,比如4G,就会出现溢出的情况,复制的结果字节丢失严重,导致复制文件和源文件大小不一样.这里修改的代码如下: public static class

  • C# FileStream复制大文件

    本文实例为大家分享了C# FileStream复制大文件的具体代码,供大家参考,具体内容如下 即每次复制文件的一小段,以节省总内存开销.当然,本机复制也可以采用.NET内部的System.IO.File.Copy方法. /// <summary> /// 复制文件 /// </summary> /// <param name="fromFile">要复制的文件</param> /// <param name="toFile

  • C#使用FileStream复制一个任意文件

    FileStream,顾名思义,文件流.流,是字节流.我的理解是,硬盘上存在一个字节流,内存里也有一个字节流,它们是对应的.程序运行时,我们只能对内存里的字节流直接操作,在它被关闭的时候,它的内容自动写入硬盘上的相应字节流. 复制一个文件的基本思路是:逐一读取原文件流的字节,逐一写入新文件流中.分别用到文件流的ReadByte()和WriteByte()方法.这里要注意的是,读取时以字节为单位,一个字节如下图所示 是一个0和1组合的序列.ReadByte()读取一个字节后将这个序列求值,返回的是

  • C# FileStream复制大文件功能

    FileStream缓冲读取和写入可以提高性能.每次复制文件的一小段,以节省总内存开销.当然,本机复制也可以采用.NET内部的System.IO.File.Copy方法. FileStream读取文件的时候,是先讲流放入内存,经Flash()方法后将内存中(缓冲中)的数据写入文件.如果文件非常大,势必消耗性能.特封装在FileHelper中以备不时之需.强制类型转换,如果文件很大,比如4G,就会出现溢出的情况,复制的结果字节丢失严重,导致复制文件和源文件大小不一样.这里修改的代码如下: publ

  • python实现复制大量文件功能

    本文实例为大家分享了python实现复制大量文件的具体代码,供大家参考,具体内容如下 本来是去项目公司拷数据,结果去了发现有500G,靠系统的复制功能怕是得好几个小时,于是回来学一手操作,话不多说上代码: 说明:CopyFiles1是可以将sourceDir连子目录一起原样复制到targetDir,而CopyFiles2是在sourceDir中筛选特定格式文件,然后将其直接放在targetDir中,会很乱,但是很快 import os import time import shutil sour

  • html+ajax实现上传大文件功能

    大家都知道php上传文件有限制,如果没有修改过php.ini文件的话,默认的上传大小限制为2M,那么该如何上传大文件了,比如说上传一个1G多的大文件,可以使用大文件切割上传的方式来解决. 何为大文件切割上传? 原理:利用HTML5的新特性,将文件内容切割成分段的二进制信息,然后每次向服务器上传一段,而服务器,只需要把我们每次上传的二进制信息整合存储到一个文件中,那么最后这个文件就是所上传的文件. 由于php.ini默认的上传大小为2M,如果每批都上传2M,我测试的时候时间比较长,这里我将其限制大

  • FireFox浏览器使用Javascript上传大文件

    本程序是利用3.x的Firefox浏览器可以读取本地文件的特性,实现通过xmlHttPRequest上传大文件功能,并在可以上传过程中动态显示上传进度.略加修改,并与服务器端配合,可以实现断点续传等诸多功能.本例主要是研究FireFox的file-input节点的一些特性,其他客户端应用,如Flash.Sliverlight等,在实现客户端大文件上传时,在数据传输与服务器端存储等方面,与本例的思路基本一致.注意:文件体积似乎有临界点,但这个临界点是多少尚未确认.建议不要用此方法上传超过100M的

  • Python利用shutil实现拷贝文件功能

    目录 楔子 chown:更改指定路径的所有者用户(组) copy:复制文件 copyfile:复制文件 copymode:复制权限位 copytree:递归复制整个目录树 disk_usage:获取磁盘的使用情况 get_archive_formats:获取支持的压缩格式 get_terminal_size:获取终端窗口的大小 make_archive:创建压缩文件 move:移动文件和目录 rmtree:删除整个目录树 which:获取可执行文件的路径 楔子 shutil 是一个 Python

  • C#使用FileStream循环读取大文件数据的方法示例

    本文实例讲述了C#使用FileStream循环读取大文件数据的方法.分享给大家供大家参考,具体如下: 今天学习了FileStream的用法,用来读取文件流,教程上都是读取小文件,一次性读取,但是如果遇到大文件,那么我们就需要循环读取文件. 直接上代码. 引用命名空间 using System.IO; 下面就是循环读取大文件的代码 class Program { static void Main(string[] args) { //循环读取大文本文件 FileStream fsRead; //获

  • PHP实现的大文件切割与合并功能示例

    本文实例讲述了PHP实现的大文件切割与合并功能.分享给大家供大家参考,具体如下: 分割代码 split.php <?php $i = 0; //分割的块编号 $fp = fopen("hadoop.sql","rb"); //要分割的文件 $file = fopen("split_hash.txt","a"); //记录分割的信息的文本文件,实际生产环境存在redis更合适 while(!feof($fp)){ $han

  • 几分钟搞懂c#之FileStream对象读写大文件(推荐)

    还是一样,我先上代码,但是为了你们测试结果和我一样,必须先有准备工作,否则会找不到目录或者文件就没有效果: 既然是读取大文件,那么这个文本必须存在 现在来看目标目录 其实这里的文本文件可以删除,因为我们写入文本数据的时候的模式是当没有找到文件就创建新的. 下面上的上代码 "` using System; using System.Collections.Generic; using System.IO; using System.Reflection; using System.Text; na

随机推荐