fcopy.n
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:5k
源码类别:

通讯编程

开发平台:

Visual C++

  1. '"
  2. '" Copyright (c) 1993 The Regents of the University of California.
  3. '" Copyright (c) 1994-1997 Sun Microsystems, Inc.
  4. '"
  5. '" See the file "license.terms" for information on usage and redistribution
  6. '" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  7. '" 
  8. '" RCS: @(#) $Id: fcopy.n,v 1.3.14.1 2007/01/29 16:50:35 dgp Exp $
  9. '" 
  10. .so man.macros
  11. .TH fcopy n 8.0 Tcl "Tcl Built-In Commands"
  12. .BS
  13. '" Note:  do not modify the .SH NAME line immediately below!
  14. .SH NAME
  15. fcopy - Copy data from one channel to another.
  16. .SH SYNOPSIS
  17. fBfcopy fIinchanfR fIoutchanfR ?fB-size fIsizefR? ?fB-command fIcallbackfR?
  18. .BE
  19. .SH DESCRIPTION
  20. .PP
  21. The fBfcopyfP command copies data from one I/O channel, fIinchanfR to another I/O channel, fIoutchanfR.
  22. The fBfcopyfP command leverages the buffering in the Tcl I/O system to
  23. avoid extra copies and to avoid buffering too much data in
  24. main memory when copying large files to slow destinations like
  25. network sockets.
  26. .PP
  27. The fBfcopyfP 
  28. command transfers data from fIinchanfR until end of file
  29. or fIsizefP bytes have been 
  30. transferred. If no fB-sizefP argument is given,
  31. then the copy goes until end of file.
  32. All the data read from fIinchanfR is copied to fIoutchanfR.
  33. Without the fB-commandfP option, fBfcopyfP blocks until the copy is complete
  34. and returns the number of bytes written to fIoutchanfR.
  35. .PP
  36. The fB-commandfP argument makes fBfcopyfP work in the background.
  37. In this case it returns immediately and the fIcallbackfP is invoked
  38. later when the copy completes.
  39. The fIcallbackfP is called with
  40. one or two additional 
  41. arguments that indicates how many bytes were written to fIoutchanfR.
  42. If an error occurred during the background copy, the second argument is the
  43. error string associated with the error.
  44. With a background copy,
  45. it is not necessary to put fIinchanfR or fIoutchanfR into
  46. non-blocking mode; the fBfcopyfP command takes care of that automatically.
  47. However, it is necessary to enter the event loop by using
  48. the fBvwaitfP command or by using Tk.
  49. .PP
  50. You are not allowed to do other I/O operations with
  51. fIinchanfR or fIoutchanfR during a background fcopy.
  52. If either fIinchanfR or fIoutchanfR get closed
  53. while the copy is in progress, the current copy is stopped
  54. and the command callback is fInotfP made.
  55. If fIinchanfR is closed,
  56. then all data already queued for fIoutchanfR is written out.
  57. .PP
  58. Note that fIinchanfR can become readable during a background copy.
  59. You should turn off any fBfileeventfP handlers during a background
  60. copy so those handlers do not interfere with the copy.
  61. Any I/O attempted by a fBfileeventfP handler will get a "channel busy" error.
  62. .PP
  63. fBFcopyfR translates end-of-line sequences in fIinchanfR and fIoutchanfR
  64. according to the fB-translationfR option
  65. for these channels.
  66. See the manual entry for fBfconfigurefR for details on the
  67. fB-translationfR option.
  68. The translations mean that the number of bytes read from fIinchanfR
  69. can be different than the number of bytes written to fIoutchanfR.
  70. Only the number of bytes written to fIoutchanfR is reported,
  71. either as the return value of a synchronous fBfcopyfP or
  72. as the argument to the callback for an asynchronous fBfcopyfP.
  73. .PP
  74. fBFcopyfR obeys the encodings configured for the channels. This
  75. means that the incoming characters are converted internally first
  76. UTF-8 and then into the encoding of the channel fBfcopyfR writes
  77. to. See the manual entry for fBfconfigurefR for details on the
  78. fB-encodingfR option. No conversion is done if both channels are
  79. set to encoding "binary". If only the output channel is set to
  80. encoding "binary" the system will write the internal UTF-8
  81. representation of the incoming characters. If only the input channel
  82. is set to encoding "binary" the system will assume that the incoming
  83. bytes are valid UTF-8 characters and convert them according to the
  84. output encoding. The behaviour of the system for bytes which are not
  85. valid UTF-8 characters is undefined in this case.
  86. .SH EXAMPLE
  87. .PP
  88. This first example shows how the callback gets
  89. passed the number of bytes transferred.
  90. It also uses vwait to put the application into the event loop.
  91. Of course, this simplified example could be done without the command 
  92. callback.
  93. .DS
  94. proc Cleanup {in out bytes {error {}}} {
  95.     global total
  96.     set total $bytes
  97.     close $in
  98.     close $out
  99.     if {[string length $error] != 0} {
  100. # error occurred during the copy
  101.     }
  102. }
  103. set in [open $file1]
  104. set out [socket $server $port]
  105. fcopy $in $out -command [list Cleanup $in $out]
  106. vwait total
  107. .DE
  108. .PP
  109. The second example copies in chunks and tests for end of file
  110. in the command callback
  111. .DS
  112. proc CopyMore {in out chunk bytes {error {}}} {
  113.     global total done
  114.     incr total $bytes
  115.     if {([string length $error] != 0) || [eof $in]} {
  116. set done $total
  117. close $in
  118. close $out
  119.     } else {
  120. fcopy $in $out -command [list CopyMore $in $out $chunk] \
  121.     -size $chunk
  122.     }
  123. }
  124. set in [open $file1]
  125. set out [socket $server $port]
  126. set chunk 1024
  127. set total 0
  128. fcopy $in $out -command [list CopyMore $in $out $chunk] -size $chunk
  129. vwait done
  130. .DE
  131. .SH "SEE ALSO"
  132. eof(n), fblocked(n), fconfigure(n)
  133. .SH KEYWORDS
  134. blocking, channel, end of line, end of file, nonblocking, read, translation