109 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			109 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
| <HTML><HEAD><TITLE>Tcl Built-In Commands - fcopy manual page</TITLE></HEAD><BODY>
 | |
| <H3><A NAME="M2">NAME</A></H3>
 | |
| fcopy - Copy data from one channel to another.
 | |
| <H3><A NAME="M3">SYNOPSIS</A></H3>
 | |
| <B>fcopy </B><I>inchan</I> <I>outchan</I> ?<B>-size </B><I>size</I>? ?<B>-command </B><I>callback</I>?<BR>
 | |
| <H3><A NAME="M4">DESCRIPTION</A></H3>
 | |
| The <B>fcopy</B> command copies data from one I/O channel, <I>inchan</I> to another I/O channel, <I>outchan</I>.
 | |
| The <B>fcopy</B> command leverages the buffering in the Tcl I/O system to
 | |
| avoid extra copies and to avoid buffering too much data in
 | |
| main memory when copying large files to slow destinations like
 | |
| network sockets.
 | |
| <P>
 | |
| The <B>fcopy</B> 
 | |
| command transfers data from <I>inchan</I> until end of file
 | |
| or <I>size</I> bytes have been 
 | |
| transferred. If no <B>-size</B> argument is given,
 | |
| then the copy goes until end of file.
 | |
| All the data read from <I>inchan</I> is copied to <I>outchan</I>.
 | |
| Without the <B>-command</B> option, <B>fcopy</B> blocks until the copy is complete
 | |
| and returns the number of bytes written to <I>outchan</I>.
 | |
| <P>
 | |
| The <B>-command</B> argument makes <B>fcopy</B> work in the background.
 | |
| In this case it returns immediately and the <I>callback</I> is invoked
 | |
| later when the copy completes.
 | |
| The <I>callback</I> is called with
 | |
| one or two additional 
 | |
| arguments that indicates how many bytes were written to <I>outchan</I>.
 | |
| If an error occurred during the background copy, the second argument is the
 | |
| error string associated with the error.
 | |
| With a background copy,
 | |
| it is not necessary to put <I>inchan</I> or <I>outchan</I> into
 | |
| non-blocking mode; the <B>fcopy</B> command takes care of that automatically.
 | |
| However, it is necessary to enter the event loop by using
 | |
| the <B><A HREF="../TkCmd/vwait.htm">vwait</A></B> command or by using Tk.
 | |
| <P>
 | |
| You are not allowed to do other I/O operations with
 | |
| <I>inchan</I> or <I>outchan</I> during a background fcopy.
 | |
| If either <I>inchan</I> or <I>outchan</I> get closed
 | |
| while the copy is in progress, the current copy is stopped
 | |
| and the command callback is <I>not</I> made.
 | |
| If <I>inchan</I> is closed,
 | |
| then all data already queued for <I>outchan</I> is written out.
 | |
| <P>
 | |
| Note that <I>inchan</I> can become readable during a background copy.
 | |
| You should turn off any <B><A HREF="../TkCmd/fileevent.htm">fileevent</A></B> handlers during a background
 | |
| copy so those handlers do not interfere with the copy.
 | |
| Any I/O attempted by a <B><A HREF="../TkCmd/fileevent.htm">fileevent</A></B> handler will get a "channel busy" error.
 | |
| <P>
 | |
| <B>Fcopy</B> translates end-of-line sequences in <I>inchan</I> and <I>outchan</I>
 | |
| according to the <B>-translation</B> option
 | |
| for these channels.
 | |
| See the manual entry for <B><A HREF="../TkCmd/fconfigure.htm">fconfigure</A></B> for details on the
 | |
| <B>-translation</B> option.
 | |
| The translations mean that the number of bytes read from <I>inchan</I>
 | |
| can be different than the number of bytes written to <I>outchan</I>.
 | |
| Only the number of bytes written to <I>outchan</I> is reported,
 | |
| either as the return value of a synchronous <B>fcopy</B> or
 | |
| as the argument to the callback for an asynchronous <B>fcopy</B>.
 | |
| 
 | |
| <H3><A NAME="M5">EXAMPLE</A></H3>
 | |
| This first example shows how the callback gets
 | |
| passed the number of bytes transferred.
 | |
| It also uses vwait to put the application into the event loop.
 | |
| Of course, this simplified example could be done without the command 
 | |
| callback.
 | |
| <PRE>proc Cleanup {in out bytes {error {}}} {
 | |
|     global total
 | |
|     set total $bytes
 | |
|     close $in
 | |
|     close $out
 | |
|     if {[string length $error] != 0} {
 | |
| 	# error occurred during the copy
 | |
|     }
 | |
| }
 | |
| set in [open $file1]
 | |
| set out [socket $server $port]
 | |
| fcopy $in $out -command [list Cleanup $in $out]
 | |
| vwait total</PRE>
 | |
| <P>
 | |
| The second example copies in chunks and tests for end of file
 | |
| in the command callback
 | |
| <PRE>proc CopyMore {in out chunk bytes {error {}}} {
 | |
|     global total done
 | |
|     incr total $bytes
 | |
|     if {([string length $error] != 0) || [eof $in] {
 | |
| 	set done $total
 | |
| 	close $in
 | |
| 	close $out
 | |
|     } else {
 | |
| 	fcopy $in $out -command [list CopyMore $in $out $chunk] \
 | |
| 	    -size $chunk
 | |
|     }
 | |
| }
 | |
| set in [open $file1]
 | |
| set out [socket $server $port]
 | |
| set chunk 1024
 | |
| set total 0
 | |
| fcopy $in $out -command [list CopyMore $in $out $chunk] -size $chunk
 | |
| vwait done</PRE>
 | |
| <H3><A NAME="M6">SEE ALSO</A></H3>
 | |
| <B><A HREF="../TkCmd/eof.htm">eof</A></B>, <B><A HREF="../TkCmd/fblocked.htm">fblocked</A></B>, <B><A HREF="../TkCmd/fconfigure.htm">fconfigure</A></B>
 | |
| <H3><A NAME="M7">KEYWORDS</A></H3>
 | |
| <A href="../Keywords/B.htm#blocking">blocking</A>, <A href="../Keywords/C.htm#channel">channel</A>, <A href="../Keywords/E.htm#end of line">end of line</A>, <A href="../Keywords/E.htm#end of file">end of file</A>, <A href="../Keywords/N.htm#nonblocking">nonblocking</A>, <A href="../Keywords/R.htm#read">read</A>, <A href="../Keywords/T.htm#translation">translation</A>
 | |
| <HR><PRE>
 | |
| <A HREF="../copyright.htm">Copyright</A> © 1993 The Regents of the University of California.
 | |
| <A HREF="../copyright.htm">Copyright</A> © 1994-1997 Sun Microsystems, Inc.
 | |
| <A HREF="../copyright.htm">Copyright</A> © 1995-1997 Roger E. Critchlow Jr.</PRE>
 | |
| </BODY></HTML>
 | 
