File.Copy vs. Manual FileStream.Write For Copying File

后端 未结 8 1843
悲&欢浪女
悲&欢浪女 2020-11-27 04:41

My problem is in regards file copying performance. We have a media management system that requires a lot of moving files around on the file system to different locations inc

8条回答
  •  攒了一身酷
    2020-11-27 05:21

    File.Copy was build around CopyFile Win32 function and this function takes lot of attention from MS crew (remember this Vista-related threads about slow copy performance).

    Several clues to improve performance of your method:

    1. Like many said earlier remove Flush method from your cycle. You do not need it at all.
    2. Increasing buffer may help, but only on file-to-file operations, for network shares, or ftp servers this will slow down instead. 60 * 1024 is ideal for network shares, at least before vista. for ftp 32k will be enough in most cases.
    3. Help os by providing your caching strategy (in your case sequential reading and writing), use FileStream constructor override with FileOptions parameter (SequentalScan).
    4. You can speed up copying by using asynchronous pattern (especially useful for network-to-file cases), but do not use threads for this, instead use overlapped io (BeginRead, EndRead, BeginWrite, EndWrite in .net), and do not forget set Asynchronous option in FileStream constructor (see FileOptions)

    Example of asynchronous copy pattern:

    int Readed = 0;
    IAsyncResult ReadResult;
    IAsyncResult WriteResult;
    
    ReadResult = sourceStream.BeginRead(ActiveBuffer, 0, ActiveBuffer.Length, null, null);
    do
    {
        Readed = sourceStream.EndRead(ReadResult);
    
        WriteResult = destStream.BeginWrite(ActiveBuffer, 0, Readed, null, null);
        WriteBuffer = ActiveBuffer;
    
        if (Readed > 0)
        {
          ReadResult = sourceStream.BeginRead(BackBuffer, 0, BackBuffer.Length, null, null);
          BackBuffer = Interlocked.Exchange(ref ActiveBuffer, BackBuffer);
        }
    
        destStream.EndWrite(WriteResult);
      }
      while (Readed > 0);
    

提交回复
热议问题