title: How to implement a performant filecopy method in C# from a network share?
body: <p>I'm trying to implement a filecopy method that can match the performance a copy done with the windows explorer.</p>
  
  <p>For exemple a copy (with the windows explorer) from our nas to my computer, performs above 100mb/sec.</p>
  
  <p>My current implementation does the same copy at about 55mb/sec which is already better than the System.IO.File.Copy() which performs at 29mb/sec.</p>
  
  <pre><code>static void Main(string[] args)
      {
          String src = @"";
          String dst = @"";
  
          Int32 buffersize = 1024 * 1024;
          FileStream input = new FileStream(src, FileMode.Open, FileAccess.Read, FileShare.None, 8, FileOptions.Asynchronous | FileOptions.SequentialScan);
          FileStream output = new FileStream(dst, FileMode.CreateNew, FileAccess.Write, FileShare.None, 8, FileOptions.Asynchronous | FileOptions.SequentialScan);
  
          Int32 readsize = -1;
          Byte[] readbuffer = new Byte[buffersize];
          IAsyncResult asyncread;
          Byte[] writebuffer = new Byte[buffersize];
          IAsyncResult asyncwrite;
  
          DateTime Start = DateTime.Now;
  
          output.SetLength(input.Length);
  
          readsize = input.Read(readbuffer, 0, readbuffer.Length);
          readbuffer = Interlocked.Exchange(ref writebuffer, readbuffer);
  
          while (readsize &gt; 0)
          {
              asyncwrite = output.BeginWrite(writebuffer, 0, readsize, null, null);
              asyncread = input.BeginRead(readbuffer, 0, readbuffer.Length, null, null);
  
              output.EndWrite(asyncwrite);
              readsize = input.EndRead(asyncread);
              readbuffer = Interlocked.Exchange(ref writebuffer, readbuffer);
          }
  
          DateTime Stop = DateTime.Now;
  
          TimeSpan Duration = Stop - Start;
          Double speed = input.Length / Duration.TotalSeconds; // bytes/s
  
          System.Console.WriteLine("MY Speed : " + (speed / 1024 / 1024).ToString() + " mo/sec");
  
          input.Close();
          output.Close();
          System.IO.File.Delete(dst);
      }
  </code></pre>
  
  <p>Any idea how to enhance the performance ?</p>
  
  <p>EDIT :</p>
  
  <p>The file is read from a linux-based nas with a 10 Gigabit Ethernet interface with a 60 drives san behind (don't worry about its performances, it works very well) and written to a local raid0 which can write data at about 140MB/sec.</p>
  
  <p>The bottleneck is the destination's gigabit network interface which I'm unable to reach with my current code.</p>
  
  <p>Also, removing the write will not make the read any faster, so I can't go past this 55MB/sec read limit.</p>
  
  <p>EDIT 2 :</p>
  
  <p>The speed issue is related to the fact that the source file is stored on a network share.
  Only reading from my local drive with my piece of code provides me a 112MB/sec speed.</p>
  
  <p>EDIT 3 :</p>
  
  <p>Samba doesn't seem to be the issue. I replaced the cifs share (samba) with a nfs share on my linux nas and got worse results than with samba on my win7 client.</p>
  
  <p>With nfs, my copy method and the windows explorer had the same performance, around 42MB/sec.</p>
  
  <p>I'm out of ideas...</p>
  
  <p>EDIT 4 :</p>
  
  <p>Just to be sure windows was the issue, I've installed a debian lenny, mounted my nas trough nfs and got 79MB/sec with the same code under mono.</p>