服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - C# FileStream复制大文件功能

C# FileStream复制大文件功能

2022-07-21 09:24lijiao C#

这篇文章主要为大家详细介绍了C# FileStream复制大文件功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
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;
    }
  }

测试代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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();
    }
  }

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

原文链接:https://blog.csdn.net/kone0611/article/details/51801119

延伸 · 阅读

精彩推荐
  • C#深入浅析Restful接口的两种使用方式

    深入浅析Restful接口的两种使用方式

    restful接口常用的两种方式是get和post.接下来通过本文给大家介绍Restful接口的两种使用方式,本文给大家介绍的非常详细,需要的朋友参考下吧...

    陈晓婵10842022-03-01
  • C#C#实现求一组数据众数的方法

    C#实现求一组数据众数的方法

    这篇文章主要介绍了C#实现求一组数据众数的方法,这里以浮点型数组为例分析了C#求众数的算法原理与实现技巧,具有一定参考借鉴价值,需要的朋友可以参考...

    北风其凉11802021-10-11
  • C#深入浅析C#中单点登录的原理和使用

    深入浅析C#中单点登录的原理和使用

    这篇文章主要介绍了C#中单点登录的原理和使用,需要的朋友可以参考下...

    农码一生3702022-01-25
  • C#C#并发编程入门教程之概述

    C#并发编程入门教程之概述

    这篇文章主要给大家介绍了关于C#并发编程之概述的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者使用c#具有一定的参考学习价值,需要...

    艾心❤11082022-07-11
  • C#C# 特殊的string类型详解

    C# 特殊的string类型详解

    本文主要介绍了C# 特殊的string类型。具有很好的参考价值,下面跟着小编一起来看下吧...

    PowerDK11632021-12-24
  • C#C# #define条件编译详解

    C# #define条件编译详解

    这篇文章主要介绍了C# #define条件编译,告诉大家#define是用来做什么?如何使用#define,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    邪心魔佛一页书11502021-12-16
  • C#C#实现带搜索功能的ComboBox

    C#实现带搜索功能的ComboBox

    这篇文章主要为大家详细介绍了C#如何实现带搜索功能的ComboBox,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    眾尋4152021-12-09
  • C#浅谈C#中的Async和Await的用法详解

    浅谈C#中的Async和Await的用法详解

    这篇文章主要介绍了浅谈C#中的Async和Await的用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们...

    依乐祝11092022-07-13