/// <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); } }
/// <exception cref="SharpCifs.Smb.SmbException"></exception> /// <exception cref="System.UriFormatException"></exception> /// <exception cref="UnknownHostException"></exception> internal SmbFileInputStream(SmbFile file, int openFlags) { this.File = file; this._openFlags = openFlags & 0xFFFF; _access = ((int)(((uint)openFlags) >> 16)) & 0xFFFF; if (file.Type != SmbFile.TypeNamedPipe) { file.Open(openFlags, _access, SmbFile.AttrNormal, 0); this._openFlags &= ~(SmbFile.OCreat | SmbFile.OTrunc); } else { file.Connect0(); } _readSize = Math.Min(file.Tree.Session.transport.RcvBufSize - 70, file.Tree.Session .transport.Server.MaxBufferSize - 70); }