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();
    }
  }


이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기