/// <summary>
/// This method will copy the file or directory represented by this
/// <tt>SmbFile</tt> and it's sub-contents to the location specified by the
/// <tt>dest</tt> parameter.
/// </summary>
/// <remarks>
/// This method will copy the file or directory represented by this
/// <tt>SmbFile</tt> and it's sub-contents to the location specified by the
/// <tt>dest</tt> parameter. This file and the destination file do not
/// need to be on the same host. This operation does not copy extended
/// file attibutes such as ACLs but it does copy regular attributes as
/// well as create and last write times. This method is almost twice as
/// efficient as manually copying as it employs an additional write
/// thread to read and write data concurrently.
/// <p/>
/// It is not possible (nor meaningful) to copy entire workgroups or
/// servers.
/// </remarks>
/// <param name="dest">the destination file or directory</param>
/// <exception cref="SmbException">SmbException</exception>
/// <exception cref="SharpCifs.Smb.SmbException"></exception>
public virtual void CopyTo(SmbFile dest)
{
SmbComReadAndX req;
SmbComReadAndXResponse resp;
WriterThread w;
int bsize;
byte[][] b;
if (_share == null || dest._share == null)
{
throw new SmbException("Invalid operation for workgroups or servers");
}
req = new SmbComReadAndX();
resp = new SmbComReadAndXResponse();
Connect0();
dest.Connect0();
ResolveDfs(null);
try
{
if (GetAddress().Equals(dest.GetAddress()) && _canon.RegionMatches(true, 0, dest._canon
, 0, Math.Min(_canon.Length, dest._canon.Length)))
{
throw new SmbException("Source and destination paths overlap.");
}
}
catch (UnknownHostException)
{
}
w = new WriterThread(this);
w.SetDaemon(true);
w.Start();
SmbTransport t1 = Tree.Session.transport;
SmbTransport t2 = dest.Tree.Session.transport;
if (t1.SndBufSize < t2.SndBufSize)
{
t2.SndBufSize = t1.SndBufSize;
}
else
{
t1.SndBufSize = t2.SndBufSize;
}
bsize = Math.Min(t1.RcvBufSize - 70, t1.SndBufSize - 70);
b = new[] { new byte[bsize], new byte[bsize] };
try
{
CopyTo0(dest, b, bsize, w, req, resp);
}
finally
{
w.Write(null, -1, null, 0);
}
}