163 lines
113 KiB
HTML
163 lines
113 KiB
HTML
|
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||
|
<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"/><meta name="viewport" content="width=device-width, initial-scale=0.8"/><title>13.1.5 File Ports</title><link rel="stylesheet" type="text/css" href="../scribble.css" title="default"/><link rel="stylesheet" type="text/css" href="extras.css" title="default"/><link rel="stylesheet" type="text/css" href="../racket.css" title="default"/><link rel="stylesheet" type="text/css" href="../manual-style.css" title="default"/><link rel="stylesheet" type="text/css" href="../manual-racket.css" title="default"/><link rel="stylesheet" type="text/css" href="../manual-racket.css" title="default"/><link rel="stylesheet" type="text/css" href="../doc-site.css" title="default"/><script type="text/javascript" src="../scribble-common.js"></script><script type="text/javascript" src="../manual-racket.js"></script><script type="text/javascript" src="../manual-racket.js"></script><script type="text/javascript" src="../doc-site.js"></script><script type="text/javascript" src="../local-redirect/local-redirect.js"></script><script type="text/javascript" src="../local-redirect/local-user-redirect.js"></script><!--[if IE 6]><style type="text/css">.SIEHidden { overflow: hidden; }</style><![endif]--></head><body id="doc-racket-lang-org"><div class="tocset"><div class="tocview"><div class="tocviewlist tocviewlisttopspace"><div class="tocviewtitle"><table cellspacing="0" cellpadding="0"><tr><td style="width: 1em;"><a href="javascript:void(0);" title="Expand/Collapse" class="tocviewtoggle" onclick="TocviewToggle(this,"tocview_0");">►</a></td><td></td><td><a href="index.html" class="tocviewlink" data-pltdoc="x">The Racket Reference</a></td></tr></table></div><div class="tocviewsublisttop" style="display: none;" id="tocview_0"><table cellspacing="0" cellpadding="0"><tr><td align="right">1 </td><td><a href="model.html" class="tocviewlink" data-pltdoc="x">Language Model</a></td></tr><tr><td align="right">2 </td><td><a href="notation.html" class="tocviewlink" data-pltdoc="x">Notation for Documentation</a></td></tr><tr><td align="right">3 </td><td><a href="syntax.html" class="tocviewlink" data-pltdoc="x">Syntactic Forms</a></td></tr><tr><td align="right">4 </td><td><a href="data.html" class="tocviewlink" data-pltdoc="x">Datatypes</a></td></tr><tr><td align="right">5 </td><td><a href="structures.html" class="tocviewlink" data-pltdoc="x">Structures</a></td></tr><tr><td align="right">6 </td><td><a href="mzlib_class.html" class="tocviewlink" data-pltdoc="x">Classes and Objects</a></td></tr><tr><td align="right">7 </td><td><a href="mzlib_unit.html" class="tocviewlink" data-pltdoc="x">Units</a></td></tr><tr><td align="right">8 </td><td><a href="contracts.html" class="tocviewlink" data-pltdoc="x">Contracts</a></td></tr><tr><td align="right">9 </td><td><a href="match.html" class="tocviewlink" data-pltdoc="x">Pattern Matching</a></td></tr><tr><td align="right">10 </td><td><a href="control.html" class="tocviewlink" data-pltdoc="x">Control Flow</a></td></tr><tr><td align="right">11 </td><td><a href="concurrency.html" class="tocviewlink" data-pltdoc="x">Concurrency and Parallelism</a></td></tr><tr><td align="right">12 </td><td><a href="Macros.html" class="tocviewlink" data-pltdoc="x">Macros</a></td></tr><tr><td align="right">13 </td><td><a href="input-and-output.html" class="tocviewselflink" data-pltdoc="x">Input and Output</a></td></tr><tr><td align="right">14 </td><td><a href="security.html" class="tocviewlink" data-pltdoc="x">Reflection and Security</a></td></tr><tr><td align="right">15 </td><td><a href="os.html" class="tocviewlink" data-pltdoc="x">Operating System</a></td></tr><tr><td align="right">16 </td><td><a href="memory.html" class="tocviewlink" data-pltdoc="x">Memory Management</a></td></tr><tr><td align="right">17 </td><td><a href="unsafe.html" class="tocviewlink" data-pltdoc="x">Unsafe Operations</a></td></tr><tr><td align="right">18 </td><td><a href="running.html" class="tocv
|
||
|
<span class="RktSym"><a href="subprocess.html#%28def._%28%28quote._~23~25kernel%29._subprocess%29%29" class="RktValLink" data-pltdoc="x">subprocess</a></span>, and related functions is a <a name="(tech._file._stream._port)"></a><span style="font-style: italic">file-stream
|
||
|
port</span>. The initial input, output, and error ports in <span class="stt">racket</span>
|
||
|
are also file-stream ports. The <span class="RktSym"><a href="port-ops.html#%28def._%28%28quote._~23~25kernel%29._file-stream-port~3f%29%29" class="RktValLink" data-pltdoc="x">file-stream-port?</a></span> predicate
|
||
|
recognizes file-stream ports.</p><p>When an input or output file-stream port is created, it is placed into
|
||
|
the management of the current custodian (see
|
||
|
<a href="custodians.html" data-pltdoc="x">Custodians</a>). In the case of an output port, a <a href="plumbers.html#%28tech._flush._callback%29" class="techoutside" data-pltdoc="x"><span class="techinside">flush
|
||
|
callback</span></a> is registered with the <a href="plumbers.html#%28tech._current._plumber%29" class="techoutside" data-pltdoc="x"><span class="techinside">current plumber</span></a> to flush the port.</p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>procedure</p></div></div><table cellspacing="0" cellpadding="0" class="prototype RForeground"><tr><td valign="top"><span class="RktPn">(</span><a name="(def._((lib._racket/private/base..rkt)._open-input-file))"></a><span title="Provided from: racket/base, racket | Package: base"><span class="RktSym"><a href="file-ports.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._open-input-file%29%29" class="RktValDef RktValLink" data-pltdoc="x">open-input-file</a></span></span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="RktVar">path</span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span></td></tr><tr><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span><span class="RktOpt">[</span></td><td valign="top"><span class="RktPn">#:mode</span><span class="hspace"> </span><span class="RktVar">mode-flag</span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span></td></tr><tr><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="RktPn">#:for-module?</span><span class="hspace"> </span><span class="RktVar">for-module?</span><span class="RktOpt">]</span><span class="RktPn">)</span></td><td valign="top"><span class="hspace"> </span></td><td valign="top">→</td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="RktSym"><a href="port-ops.html#%28def._%28%28quote._~23~25kernel%29._input-port~3f%29%29" class="RktValLink" data-pltdoc="x">input-port?</a></span></td></tr></table></blockquote></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">path</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="Manipulating_Paths.html#%28def._%28%28lib._racket%2Fprivate%2Fmisc..rkt%29._path-string~3f%29%29" class="RktValLink" data-pltdoc="x">path-string?</a></span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">mode-flag</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="data-structure-contracts.html#%28def._%28%28lib._racket%2Fcontract%2Fbase..rkt%29._or%2Fc%29%29" class="RktValLink" data-pltdoc="x">or/c</a></span><span class="hspace"> </span><span class="RktVal">'</span><span class="RktVal">binary</span><span class="hspace"> </span><span class="RktVal">'</span><span class="RktVal">text</span><span class="RktPn">)</span><span class="hspace"> </span>=<span class="hspace"> </span><span class="RktVal">'</span><span class="RktVal">binary</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">for-module?</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="data-structure-contracts.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fmisc..rkt%29._any%2Fc%29%29" class="RktValLink" data-pltdoc="x">any/c</a></span><span class="hspace"> </span>=<span class="hspace"> </span><span class="RktVal">#f</span></td></tr></table></blockquote></div><div class="SIntrapara">Opens the file specified by <span class="RktVar">path</span> for input. The
|
||
|
<span class="RktVar">mode-flag</span> argument specifies how the file’s bytes are
|
||
|
translated on input:</div></p><ul><li><p><a name="(idx._(gentag._251._(lib._scribblings/reference/reference..scrbl)))"></a><span class="RktVal">'</span><span class="RktVal">binary</span> —<wbr></wbr> bytes are returned from the port
|
||
|
exactly as they are read from the file.</p></li><li><p><a name="(idx._(gentag._252._(lib._scribblings/reference/reference..scrbl)))"></a><span class="RktVal">'</span><span class="RktVal">text</span> —<wbr></wbr> return and linefeed bytes (10 and
|
||
|
13) as read from the file are filtered by the port in a platform
|
||
|
specific manner:</p><ul><li><p>Unix and Mac OS: no filtering occurs.</p></li><li><p>Windows: a return-linefeed combination from a file is returned
|
||
|
by the port as a single linefeed; no filtering occurs for
|
||
|
return bytes that are not followed by a linefeed, or for a
|
||
|
linefeed that is not preceded by a return.</p></li></ul></li></ul><p>On Windows, <span class="RktVal">'</span><span class="RktVal">text</span> mode works only with regular files;
|
||
|
attempting to use <span class="RktVal">'</span><span class="RktVal">text</span> with other kinds of files triggers an
|
||
|
<span class="RktSym"><a href="exns.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._exn~3afail~3afilesystem%29%29" class="RktValLink" data-pltdoc="x">exn:fail:filesystem</a></span> exception.</p><p>Otherwise, the file specified by <span class="RktVar">path</span> need not be a regular
|
||
|
file. It might be a device that is connected through the filesystem, such
|
||
|
as <span class="stt">"aux"</span> on Windows or <span class="stt">"/dev/null"</span> on Unix. In all
|
||
|
cases, the port is buffered by default.</p><p>The port produced by <span class="RktSym"><a href="file-ports.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._open-input-file%29%29" class="RktValLink" data-pltdoc="x">open-input-file</a></span> should be explicitly
|
||
|
closed, either though <span class="RktSym"><a href="port-ops.html#%28def._%28%28quote._~23~25kernel%29._close-input-port%29%29" class="RktValLink" data-pltdoc="x">close-input-port</a></span> or indirectly via
|
||
|
<span class="RktSym"><a href="custodians.html#%28def._%28%28quote._~23~25kernel%29._custodian-shutdown-all%29%29" class="RktValLink" data-pltdoc="x">custodian-shutdown-all</a></span>, to release the OS-level file
|
||
|
handle. The input port will not be closed automatically if it is
|
||
|
otherwise available for garbage collection (see
|
||
|
<a href="eval-model.html#%28part._gc-model%29" data-pltdoc="x">Garbage Collection</a>); a <a href="willexecutor.html#%28tech._will%29" class="techoutside" data-pltdoc="x"><span class="techinside">will</span></a> could be associated with an input port
|
||
|
to close it more automatically (see <a href="willexecutor.html" data-pltdoc="x">Wills and Executors</a>).</p><p>A <a href="pathutils.html#%28tech._path%29" class="techoutside" data-pltdoc="x"><span class="techinside">path</span></a> value that is the <a href="pathutils.html#%28tech._cleanse%29" class="techoutside" data-pltdoc="x"><span class="techinside">cleanse</span></a>d version of
|
||
|
<span class="RktVar">path</span> is used as the name of the opened port.</p><p>If opening the file fails due to an error in the filesystem,
|
||
|
then <span class="RktSym"><a href="exns.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._exn~3afail~3afilesystem~3aerrno%29%29" class="RktValLink" data-pltdoc="x">exn:fail:filesystem:errno</a></span> exception is raised—<wbr></wbr>as long as
|
||
|
<span class="RktVar">for-module?</span> is <span class="RktVal">#f</span>,
|
||
|
<span class="RktSym"><a href="Module_Names_and_Loading.html#%28def._%28%28quote._~23~25kernel%29._current-module-path-for-load%29%29" class="RktValLink" data-pltdoc="x">current-module-path-for-load</a></span> has a non-<span class="RktVal">#f</span> value, or
|
||
|
the filesystem error is not recognized as a file-not-found error. Otherwise,
|
||
|
when <span class="RktVar">for-module?</span> is true,
|
||
|
<span class="RktSym"><a href="Module_Names_and_Loading.html#%28def._%28%28quote._~23~25kernel%29._current-module-path-for-load%29%29" class="RktValLink" data-pltdoc="x">current-module-path-for-load</a></span> has a non-<span class="RktVal">#f</span> value,
|
||
|
and the filesystem error is recognized as a file-not-found error,
|
||
|
then the raised exception is either
|
||
|
<span class="RktSym"><a href="exns.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._exn~3afail~3asyntax~3amissing-module%29%29" class="RktValLink" data-pltdoc="x">exn:fail:syntax:missing-module</a></span> (if the value of
|
||
|
<span class="RktSym"><a href="Module_Names_and_Loading.html#%28def._%28%28quote._~23~25kernel%29._current-module-path-for-load%29%29" class="RktValLink" data-pltdoc="x">current-module-path-for-load</a></span> is a <a href="syntax-model.html#%28tech._syntax._object%29" class="techoutside" data-pltdoc="x"><span class="techinside">syntax object</span></a>) or
|
||
|
<span class="RktSym"><a href="exns.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._exn~3afail~3afilesystem~3amissing-module%29%29" class="RktValLink" data-pltdoc="x">exn:fail:filesystem:missing-module</a></span> (otherwise).</p><p class="SHistory">Changed in version 6.0.1.6 of package <span class="stt">base</span>: Added <span class="RktPn">#:for-module?</span>.</p><p><div class="SIntrapara">Examples:</div><div class="SIntrapara"><blockquote class="SCodeFlow"><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="stt">> </span><span class="RktPn">(</span><span class="RktSym"><a href="file-ports.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._with-output-to-file%29%29" class="RktValLink" data-pltdoc="x">with-output-to-file</a></span><span class="hspace"> </span><span class="RktSym">some-file</span></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="lambda.html#%28form._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._lambda%29%29" class="RktStxLink" data-pltdoc="x">lambda</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktPn">)</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="Writing.html#%28def._%28%28quote._~23~25kernel%29._printf%29%29" class="RktValLink" data-pltdoc="x">printf</a></span><span class="hspace"> </span><span class="RktVal">"hello world"</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr></table></td></tr><tr><td><span class="stt">> </span><span class="RktPn">(</span><span class="RktSym"><a href="define.html#%28form._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._define%29%29" class="RktStxLink" data-pltdoc="x">define</a></span><span class="hspace"> </span><span class="RktSym">in</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="file-ports.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._open-input-file%29%29" class="RktValLink" data-pltdoc="x">open-input-file</a></span><span class="hspace"> </span><span class="RktSym">some-file</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="stt">> </span><span class="RktPn">(</span><span class="RktSym"><a href="Byte_and_String_Input.html#%28def._%28%28quote._~23~25kernel%29._read-string%29%29" class="RktValLink" data-pltdoc="x">read-string</a></span><span class="hspace"> </span><span class="RktVal">11</span><span class="hspace"> </span><span class="RktSym">in</span><span class="RktPn">)</span></td></tr><tr><td><p><span class="RktRes">"hello world"</span></p></td></tr><tr><td><span class="stt">> </span><span class="RktPn">(</span><span class="RktSym"><a href="port-ops.html#%28def._%28%28quote._~23~25kernel%29._close-input-port%29%29" class="RktValLink" data-pltdoc="x">close-input-port</a></span><span class="hspace"> </span><span class="RktSym">in</span><span class="RktPn">)</span></td></tr></table></blockquote></div></p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>procedure</p></div></div><table cellspacing="0" cellpadding="0" class="prototype RForeground"><tr><td valign="top"><span class="RktPn">(</span><a name="(def._((lib._racket/private/base..rkt)._open-output-file))"></a><span title="Provided from: racket/base, racket | Package: base"><span class="RktSym"><a href="file-ports.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._open-output-file%29%29" class="RktValDef RktValLink" data-pltdoc="x">open-output-file</a></span></span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="RktVar">path</span></td><td valign="top"><span class="hspace"> </span></td><td valign="
|
||
|
<span class="RktVar">mode-flag</span> argument specifies how bytes written to the port
|
||
|
are translated when written to the file:</div></p><ul><li><p><span class="RktVal">'</span><span class="RktVal">binary</span> —<wbr></wbr> bytes are written to the file exactly
|
||
|
as written to the port.</p></li><li><p><span class="RktVal">'</span><span class="RktVal">text</span> —<wbr></wbr> on Windows, a linefeed byte (10) written
|
||
|
to the port is translated to a return-linefeed combination in the
|
||
|
file; no filtering occurs for returns.</p></li></ul><p>On Windows, <span class="RktVal">'</span><span class="RktVal">text</span> mode works only with regular files;
|
||
|
attempting to use <span class="RktVal">'</span><span class="RktVal">text</span> with other kinds of files triggers an
|
||
|
<span class="RktSym"><a href="exns.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._exn~3afail~3afilesystem%29%29" class="RktValLink" data-pltdoc="x">exn:fail:filesystem</a></span> exception.</p><p>The <span class="RktVar">exists-flag</span> argument specifies how to handle/require
|
||
|
files that already exist:</p><ul><li><p><a name="(idx._(gentag._253._(lib._scribblings/reference/reference..scrbl)))"></a><span class="RktVal">'</span><span class="RktVal">error</span> —<wbr></wbr> raise <span class="RktSym"><a href="exns.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._exn~3afail~3afilesystem%29%29" class="RktValLink" data-pltdoc="x">exn:fail:filesystem</a></span>
|
||
|
if the file exists.</p></li><li><p><a name="(idx._(gentag._254._(lib._scribblings/reference/reference..scrbl)))"></a><span class="RktVal">'</span><span class="RktVal">replace</span> —<wbr></wbr> remove the old file, if it
|
||
|
exists, and write a new one.</p></li><li><p><a name="(idx._(gentag._255._(lib._scribblings/reference/reference..scrbl)))"></a><span class="RktVal">'</span><span class="RktVal">truncate</span> —<wbr></wbr> remove all old data, if the file
|
||
|
exists.</p></li><li><p><a name="(idx._(gentag._256._(lib._scribblings/reference/reference..scrbl)))"></a><span class="RktVal">'</span><span class="RktVal">must-truncate</span> —<wbr></wbr> remove all old data in an
|
||
|
existing file; if the file does not exist, the
|
||
|
<span class="RktSym"><a href="exns.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._exn~3afail~3afilesystem%29%29" class="RktValLink" data-pltdoc="x">exn:fail:filesystem</a></span> exception is raised.</p></li><li><p><a name="(idx._(gentag._257._(lib._scribblings/reference/reference..scrbl)))"></a><span class="RktVal">'</span><span class="RktVal">truncate/replace</span> —<wbr></wbr> try <span class="RktVal">'</span><span class="RktVal">truncate</span>;
|
||
|
if it fails (perhaps due to file permissions), try
|
||
|
<span class="RktVal">'</span><span class="RktVal">replace</span>.</p></li><li><p><a name="(idx._(gentag._258._(lib._scribblings/reference/reference..scrbl)))"></a><span class="RktVal">'</span><span class="RktVal">update</span> —<wbr></wbr> open an existing file without
|
||
|
truncating it; if the file does not exist, the
|
||
|
<span class="RktSym"><a href="exns.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._exn~3afail~3afilesystem%29%29" class="RktValLink" data-pltdoc="x">exn:fail:filesystem</a></span> exception is raised. Use <span class="RktSym"><a href="port-buffers.html#%28def._%28%28quote._~23~25kernel%29._file-position%29%29" class="RktValLink" data-pltdoc="x">file-position</a></span>
|
||
|
to change the current read/write position.</p></li><li><p><a name="(idx._(gentag._259._(lib._scribblings/reference/reference..scrbl)))"></a><span class="RktVal">'</span><span class="RktVal">can-update</span> —<wbr></wbr> open an existing file without
|
||
|
truncating it, or create the file if it does not exist.</p></li><li><p><a name="(idx._(gentag._260._(lib._scribblings/reference/reference..scrbl)))"></a><span class="RktVal">'</span><span class="RktVal">append</span> —<wbr></wbr> append to the end of the file,
|
||
|
whether it already exists or not; on Windows,
|
||
|
<span class="RktVal">'</span><span class="RktVal">append</span> is equivalent to <span class="RktVal">'</span><span class="RktVal">update</span>, except that
|
||
|
the file is not required to exist, and the file position is
|
||
|
immediately set to the end of the file after opening it.</p></li></ul><p>When the file specified by <span class="RktVar">path</span> is created,
|
||
|
<span class="RktVar">permissions</span> specifies the permissions of the created file,
|
||
|
where an integer representation of permissions is treated the same as
|
||
|
for <span class="RktSym"><a href="Filesystem.html#%28def._%28%28quote._~23~25kernel%29._file-or-directory-permissions%29%29" class="RktValLink" data-pltdoc="x">file-or-directory-permissions</a></span>. On Unix and Mac OS, these
|
||
|
permissions bits are combined with the process’s umask. On Windows,
|
||
|
the only relevant property of <span class="RktVar">permissions</span> is whether it has
|
||
|
the <span class="RktVal">#o2</span> bit set for write permission. Note that a
|
||
|
read-only file can be created with <span class="RktSym"><a href="file-ports.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._open-output-file%29%29" class="RktValLink" data-pltdoc="x">open-output-file</a></span>, in which
|
||
|
case writing is prohibited only for later attempts to open the file.</p><p>The file specified by <span class="RktVar">path</span> need not be a regular file. It
|
||
|
might be a device that is connected through the filesystem, such as
|
||
|
<span class="stt">"aux"</span> on Windows or <span class="stt">"/dev/null"</span> on Unix. The output
|
||
|
port is block-buffered by default, unless the file corresponds to a
|
||
|
terminal, in which case it is line-buffered by default. On Unix and
|
||
|
Mac OS, if the file is a fifo, then the port will block for writing
|
||
|
until a reader for the fifo is available; see also
|
||
|
<span class="RktSym"><a href="port-ops.html#%28def._%28%28quote._~23~25kernel%29._port-waiting-peer~3f%29%29" class="RktValLink" data-pltdoc="x">port-waiting-peer?</a></span>.</p><p>The port produced by <span class="RktSym"><a href="file-ports.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._open-output-file%29%29" class="RktValLink" data-pltdoc="x">open-output-file</a></span> should be explicitly
|
||
|
closed, either though <span class="RktSym"><a href="port-ops.html#%28def._%28%28quote._~23~25kernel%29._close-output-port%29%29" class="RktValLink" data-pltdoc="x">close-output-port</a></span> or indirectly via
|
||
|
<span class="RktSym"><a href="custodians.html#%28def._%28%28quote._~23~25kernel%29._custodian-shutdown-all%29%29" class="RktValLink" data-pltdoc="x">custodian-shutdown-all</a></span>, to release the OS-level file
|
||
|
handle. The output port will not be closed automatically if it is
|
||
|
otherwise available for garbage collection (see
|
||
|
<a href="eval-model.html#%28part._gc-model%29" data-pltdoc="x">Garbage Collection</a>); a <a href="willexecutor.html#%28tech._will%29" class="techoutside" data-pltdoc="x"><span class="techinside">will</span></a> could be associated with an output port
|
||
|
to close it more automatically (see <a href="willexecutor.html" data-pltdoc="x">Wills and Executors</a>).</p><p>A <a href="pathutils.html#%28tech._path%29" class="techoutside" data-pltdoc="x"><span class="techinside">path</span></a> value that is the <a href="pathutils.html#%28tech._cleanse%29" class="techoutside" data-pltdoc="x"><span class="techinside">cleanse</span></a>d version of
|
||
|
<span class="RktVar">path</span> is used as the name of the opened port.</p><p>If opening the file fails due to an error in the underlying filesystem
|
||
|
then <span class="RktSym"><a href="exns.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._exn~3afail~3afilesystem~3aerrno%29%29" class="RktValLink" data-pltdoc="x">exn:fail:filesystem:errno</a></span> exception is raised.</p><p><div class="SIntrapara">Examples:</div><div class="SIntrapara"><blockquote class="SCodeFlow"><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="stt">> </span><span class="RktPn">(</span><span class="RktSym"><a href="define.html#%28form._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._define%29%29" class="RktStxLink" data-pltdoc="x">define</a></span><span class="hspace"> </span><span class="RktSym">out</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="file-ports.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._open-output-file%29%29" class="RktValLink" data-pltdoc="x">open-output-file</a></span><span class="hspace"> </span><span class="RktSym">some-file</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="stt">> </span><span class="RktPn">(</span><span class="RktSym"><a href="Writing.html#%28def._%28%28quote._~23~25kernel%29._write%29%29" class="RktValLink" data-pltdoc="x">write</a></span><span class="hspace"> </span><span class="RktVal">"hello world"</span><span class="hspace"> </span><span class="RktSym">out</span><span class="RktPn">)</span></td></tr><tr><td><span class="stt">> </span><span class="RktPn">(</span><span class="RktSym"><a href="port-ops.html#%28def._%28%28quote._~23~25kernel%29._close-output-port%29%29" class="RktValLink" data-pltdoc="x">close-output-port</a></span><span class="hspace"> </span><span class="RktSym">out</span><span class="RktPn">)</span></td></tr></table></blockquote></div></p><p class="SHistory">Changed in version 6.9.0.6 of package <span class="stt">base</span>: On Unix and Mac OS, make <span class="RktVal">'</span><span class="RktVal">truncate/replace</span>
|
||
|
replace on a permission error. On Windows, make
|
||
|
<span class="RktVal">'</span><span class="RktVal">replace</span> always replace instead truncating
|
||
|
like <span class="RktVal">'</span><span class="RktVal">truncate/replace</span>.<br/>Changed in version 7.4.0.5: Changed handling of a fifo on Unix and Mac OS to
|
||
|
make the port block for output until the fifo has a
|
||
|
reader.<br/>Changed in version 8.1.0.3: Added the <span class="RktPn">#:permissions</span> argument.</p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>procedure</p></div></div><table cellspacing="0" cellpadding="0" class="prototype RForeground"><tr><td valign="top"><span class="RktPn">(</span><a name="(def._((lib._racket/private/base..rkt)._open-input-output-file))"></a><span title="Provided from: racket/base, racket | Package: base"><span class="RktSym"><a href="file-ports.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._open-input-output-file%29%29" class="RktValDef RktValLink" data-pltdoc="x">open-input-output-file</a></span></span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="RktVar">path</span></td><td valign="top"><span class="hspace"> </span></td></tr><tr><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span><span class="RktOpt">[</span></td><td valign="top"><span class="RktPn">#:mode</span><span class="hspace"> </span><span class="RktVar">mode-flag</span></td><td valign="top"><span class="hspace"> </span></td></tr><tr><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="RktPn">#:exists</span><span class="hspace"> </span><span class="RktVar">exists-flag</span></td><td valign="top"><span class="hspace"> </span></td></tr><tr><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="RktPn">#:permissions</span><span class="hspace"> </span><span class="RktVar">permissions</span><span class="RktOpt">]</span><span class="RktPn">)</span></td><td valign="top"><span class="hspace"> </span></td></tr></table></blockquote></td></tr><tr><td><table cellspacing="0" cellpadding="0" class="prototype"><tr><td valign="top"><span class="hspace"> </span></td><td valign="top">→</td><td valign="top"><span class="hspace"> </span></td><td valign="top"><table cellspacing="0" cellpadding="0"><tr><td><span class="RktSym"><a href="port-ops.html#%28def._%28%28quote._~23~25kernel%29._input-port~3f%29%29" class="RktValLink" data-pltdoc="x">input-port?</a></span></td><td><span class="hspace"> </span></td><td><span class="RktSym"><a href="port-ops.html#%28def._%28%28quote._~23~25kernel%29._output-port~3f%29%29" class="RktValLink" data-pltdoc="x">output-port?</a></span></td></tr></table></td></tr></table></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">path</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="Manipulating_Paths.html#%28def._%28%28lib._racket%2Fprivate%2Fmisc..rkt%29._path-string~3f%29%29" class="RktValLink" data-pltdoc="x">path-string?</a></span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">mode-flag</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="data-structure-contracts.html#%28def._%28%28lib._racket%2Fcontract%2Fbase..rkt%29._or%2Fc%29%29" class="RktValLink" data-pltdoc="x">or/c</a></span><span class="hspace"> </span><span class="RktVal">'</span><span class="RktVal">binary</span><span class="hspace"> </span><span class="RktVal">'</span><span class="RktVal">text</span><span class="RktPn">)</span><span class="hspace"> </span>=<span class="hspace"> </span><span class="RktVal">'</span><span class="RktVal">binary</span></td></tr><tr><td><table cellspacing="0" cellpadding="0" class="argcontract"><tr><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="RktVar">exists-flag</span></td><td valign="top"><span class="hspace"> </span></td><td valign="top">:</td><td valign=
|
||
|
port and an output port. The two ports are connected in that they
|
||
|
share the underlying file descriptor. This procedure is intended for use
|
||
|
with special devices that can be opened by only one process, such as
|
||
|
<span class="stt">"COM1"</span> in Windows. For regular files, sharing the file descriptor can be
|
||
|
confusing. For example, using one port does not automatically flush
|
||
|
the other port’s buffer, and reading or writing in one port moves the
|
||
|
file position (if any) for the other port. For regular files, use
|
||
|
separate <span class="RktSym"><a href="file-ports.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._open-input-file%29%29" class="RktValLink" data-pltdoc="x">open-input-file</a></span> and <span class="RktSym"><a href="file-ports.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._open-output-file%29%29" class="RktValLink" data-pltdoc="x">open-output-file</a></span> calls
|
||
|
to avoid confusion.</div></p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>procedure</p></div></div><table cellspacing="0" cellpadding="0" class="prototype RForeground"><tr><td valign="top"><span class="RktPn">(</span><a name="(def._((lib._racket/private/base..rkt)._call-with-input-file))"></a><span title="Provided from: racket/base, racket | Package: base"><span class="RktSym"><a href="file-ports.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._call-with-input-file%29%29" class="RktValDef RktValLink" data-pltdoc="x">call-with-input-file</a></span></span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="RktVar">path</span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span></td></tr><tr><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="RktVar">proc</span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span></td></tr><tr><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span><span class="RktOpt">[</span></td><td valign="top"><span class="RktPn">#:mode</span><span class="hspace"> </span><span class="RktVar">mode-flag</span><span class="RktOpt">]</span><span class="RktPn">)</span></td><td valign="top"><span class="hspace"> </span></td><td valign="top">→</td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="RktSym"><a href="data-structure-contracts.html#%28form._%28%28lib._racket%2Fcontract%2Fprivate%2Fmisc..rkt%29._any%29%29" class="RktStxLink" data-pltdoc="x">any</a></span></td></tr></table></blockquote></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">path</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="Manipulating_Paths.html#%28def._%28%28lib._racket%2Fprivate%2Fmisc..rkt%29._path-string~3f%29%29" class="RktValLink" data-pltdoc="x">path-string?</a></span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">proc</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="port-ops.html#%28def._%28%28quote._~23~25kernel%29._input-port~3f%29%29" class="RktValLink" data-pltdoc="x">input-port?</a></span><span class="hspace"> </span><span class="RktPn">. </span><span class="RktSym"><a href="function-contracts.html#%28form._%28%28lib._racket%2Fcontract%2Fbase..rkt%29._-~3e%29%29" class="RktStxLink" data-pltdoc="x"><span class="nobreak">-></span></a></span><span class="RktPn"> .</span><span class="hspace"> </span><span class="RktSym"><a href="data-structure-contracts.html#%28form._%28%28lib._racket%2Fcontract%2Fprivate%2Fmisc..rkt%29._any%29%29" class="RktStxLink" data-pltdoc="x">any</a></span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">mode-flag</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="data-structure-contracts.html#%28def._%28%28lib._racket%2Fcontract%2Fbase..rkt%29._or%2Fc%29%29" class="RktValLink" data-pltdoc="x">or/c</a></span><span class="hspace"> </span><span class="RktVal">'</span><span class="RktVal">binary</span><span class="hspace"> </span><span class="RktVal">'</span><span class="RktVal">text</span><span class="RktPn">)</span><span class="hspace"> </span>=<span class="hspace"> </span><span cl
|
||
|
<span class="RktVar">mode-flag</span> arguments, and passes the resulting port
|
||
|
to <span class="RktVar">proc</span>. The result of <span class="RktVar">proc</span> is the result of the
|
||
|
<span class="RktSym"><a href="file-ports.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._call-with-input-file%29%29" class="RktValLink" data-pltdoc="x">call-with-input-file</a></span> call, but the newly opened port is closed
|
||
|
when <span class="RktVar">proc</span> returns.</div></p><p><div class="SIntrapara">Examples:</div><div class="SIntrapara"><blockquote class="SCodeFlow"><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="stt">> </span><span class="RktPn">(</span><span class="RktSym"><a href="file-ports.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._with-output-to-file%29%29" class="RktValLink" data-pltdoc="x">with-output-to-file</a></span><span class="hspace"> </span><span class="RktSym">some-file</span></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="lambda.html#%28form._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._lambda%29%29" class="RktStxLink" data-pltdoc="x">lambda</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktPn">)</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="Writing.html#%28def._%28%28quote._~23~25kernel%29._printf%29%29" class="RktValLink" data-pltdoc="x">printf</a></span><span class="hspace"> </span><span class="RktVal">"text in a file"</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr></table></td></tr><tr><td><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="stt">> </span><span class="RktPn">(</span><span class="RktSym"><a href="file-ports.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._call-with-input-file%29%29" class="RktValLink" data-pltdoc="x">call-with-input-file</a></span><span class="hspace"> </span><span class="RktSym">some-file</span></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="lambda.html#%28form._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._lambda%29%29" class="RktStxLink" data-pltdoc="x">lambda</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">in</span><span class="RktPn">)</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="Byte_and_String_Input.html#%28def._%28%28quote._~23~25kernel%29._read-string%29%29" class="RktValLink" data-pltdoc="x">read-string</a></span><span class="hspace"> </span><span class="RktVal">14</span><span class="hspace"> </span><span class="RktSym">in</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr></table></td></tr><tr><td><p><span class="RktRes">"text in a file"</span></p></td></tr></table></blockquote></div></p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>procedure</p></div></div><table cellspacing="0" cellpadding="0" class="prototype RForeground"><tr><td valign="top"><span class="RktPn">(</span><a name="(def._((lib._racket/private/base..rkt)._call-with-output-file))"></a><span title="Provided from: racket/base, racket | Package: base"><span class="RktSym"><a href="file-ports.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._call-with-output-file%29%29" class="RktValDef RktValLink" data-pltdoc="x">call-with-output-file</a></span></span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="RktVar">path</span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span></td></tr><tr><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="RktVar">proc</span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span></
|
||
|
<span class="RktVar">mode-flag</span>, <span class="RktVar">exists-flag</span>, and <span class="RktVar">permissions</span> to
|
||
|
<span class="RktSym"><a href="file-ports.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._open-output-file%29%29" class="RktValLink" data-pltdoc="x">open-output-file</a></span>.</div></p><p><div class="SIntrapara">Examples:</div><div class="SIntrapara"><blockquote class="SCodeFlow"><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="stt">> </span><span class="RktPn">(</span><span class="RktSym"><a href="file-ports.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._call-with-output-file%29%29" class="RktValLink" data-pltdoc="x">call-with-output-file</a></span><span class="hspace"> </span><span class="RktSym">some-file</span></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="lambda.html#%28form._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._lambda%29%29" class="RktStxLink" data-pltdoc="x">lambda</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">out</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="Writing.html#%28def._%28%28quote._~23~25kernel%29._write%29%29" class="RktValLink" data-pltdoc="x">write</a></span><span class="hspace"> </span><span class="RktVal">'</span><span class="RktVal">hello</span><span class="hspace"> </span><span class="RktSym">out</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr></table></td></tr><tr><td><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="stt">> </span><span class="RktPn">(</span><span class="RktSym"><a href="file-ports.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._call-with-input-file%29%29" class="RktValLink" data-pltdoc="x">call-with-input-file</a></span><span class="hspace"> </span><span class="RktSym">some-file</span></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="lambda.html#%28form._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._lambda%29%29" class="RktStxLink" data-pltdoc="x">lambda</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">in</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="Byte_and_String_Input.html#%28def._%28%28quote._~23~25kernel%29._read-string%29%29" class="RktValLink" data-pltdoc="x">read-string</a></span><span class="hspace"> </span><span class="RktVal">5</span><span class="hspace"> </span><span class="RktSym">in</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr></table></td></tr><tr><td><p><span class="RktRes">"hello"</span></p></td></tr></table></blockquote></div></p><p class="SHistory">Changed in version 8.1.0.3 of package <span class="stt">base</span>: Added the <span class="RktPn">#:permissions</span> argument.</p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>procedure</p></div></div><table cellspacing="0" cellpadding="0" class="prototype RForeground"><tr><td valign="top"><span class="RktPn">(</span><a name="(def._((lib._racket/private/base..rkt)._call-with-input-file*))"></a><span title="Provided from: racket/base, racket | Package: base"><span class="RktSym"><a href="file-ports.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._call-with-input-file%2A%29%29" class="RktValDef RktValLink" data-pltdoc="x">call-with-input-file*</a></span></span></td><td valign="top"><span class="hspace"> </span></td><td valign
|
||
|
closed whenever control escapes the dynamic extent of the
|
||
|
<span class="RktSym"><a href="file-ports.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._call-with-input-file%2A%29%29" class="RktValLink" data-pltdoc="x">call-with-input-file*</a></span> call, whether through <span class="RktVar">proc</span>’s
|
||
|
return, a continuation application, or a prompt-based abort.</div></p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>procedure</p></div></div><table cellspacing="0" cellpadding="0" class="prototype RForeground"><tr><td valign="top"><span class="RktPn">(</span><a name="(def._((lib._racket/private/base..rkt)._call-with-output-file*))"></a><span title="Provided from: racket/base, racket | Package: base"><span class="RktSym"><a href="file-ports.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._call-with-output-file%2A%29%29" class="RktValDef RktValLink" data-pltdoc="x">call-with-output-file*</a></span></span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="RktVar">path</span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span></td></tr><tr><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="RktVar">proc</span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span></td></tr><tr><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span><span class="RktOpt">[</span></td><td valign="top"><span class="RktPn">#:mode</span><span class="hspace"> </span><span class="RktVar">mode-flag</span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span></td></tr><tr><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="RktPn">#:exists</span><span class="hspace"> </span><span class="RktVar">exists-flag</span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span></td></tr><tr><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="RktPn">#:permissions</span><span class="hspace"> </span><span class="RktVar">permissions</span><span class="RktOpt">]</span><span class="RktPn">)</span></td><td valign="top"><span class="hspace"> </span></td><td valign="top">→</td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="RktSym"><a href="data-structure-contracts.html#%28form._%28%28lib._racket%2Fcontract%2Fprivate%2Fmisc..rkt%29._any%29%29" class="RktStxLink" data-pltdoc="x">any</a></span></td></tr></table></blockquote></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">path</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="Manipulating_Paths.html#%28def._%28%28lib._racket%2Fprivate%2Fmisc..rkt%29._path-string~3f%29%29" class="RktValLink" data-pltdoc="x">path-string?</a></span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">proc</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="port-ops.html#%28def._%28%28quote._~23~25kernel%29._output-port~3f%29%29" class="RktValLink" data-pltdoc="x">output-port?</a></span><span class="hspace"> </span><span class="RktPn">. </span><span class="RktSym"><a href="function-contracts.html#%28form._%28%28lib._racket%2Fcontract%2Fbase..rkt%29._-~3e%29%29" class="RktStxLi
|
||
|
closed whenever control escapes the dynamic extent of the
|
||
|
<span class="RktSym"><a href="file-ports.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._call-with-output-file%2A%29%29" class="RktValLink" data-pltdoc="x">call-with-output-file*</a></span> call, whether through <span class="RktVar">proc</span>’s
|
||
|
return, a continuation application, or a prompt-based abort.</div></p><p class="SHistory">Changed in version 8.1.0.3 of package <span class="stt">base</span>: Added the <span class="RktPn">#:permissions</span> argument.</p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>procedure</p></div></div><table cellspacing="0" cellpadding="0" class="prototype RForeground"><tr><td valign="top"><span class="RktPn">(</span><a name="(def._((lib._racket/private/base..rkt)._with-input-from-file))"></a><span title="Provided from: racket/base, racket | Package: base"><span class="RktSym"><a href="file-ports.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._with-input-from-file%29%29" class="RktValDef RktValLink" data-pltdoc="x">with-input-from-file</a></span></span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="RktVar">path</span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span></td></tr><tr><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="RktVar">thunk</span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span></td></tr><tr><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span><span class="RktOpt">[</span></td><td valign="top"><span class="RktPn">#:mode</span><span class="hspace"> </span><span class="RktVar">mode-flag</span><span class="RktOpt">]</span><span class="RktPn">)</span></td><td valign="top"><span class="hspace"> </span></td><td valign="top">→</td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="RktSym"><a href="data-structure-contracts.html#%28form._%28%28lib._racket%2Fcontract%2Fprivate%2Fmisc..rkt%29._any%29%29" class="RktStxLink" data-pltdoc="x">any</a></span></td></tr></table></blockquote></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">path</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="Manipulating_Paths.html#%28def._%28%28lib._racket%2Fprivate%2Fmisc..rkt%29._path-string~3f%29%29" class="RktValLink" data-pltdoc="x">path-string?</a></span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">thunk</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="function-contracts.html#%28form._%28%28lib._racket%2Fcontract%2Fbase..rkt%29._-~3e%29%29" class="RktStxLink" data-pltdoc="x"><span class="nobreak">-></span></a></span><span class="hspace"> </span><span class="RktSym"><a href="data-structure-contracts.html#%28form._%28%28lib._racket%2Fcontract%2Fprivate%2Fmisc..rkt%29._any%29%29" class="RktStxLink" data-pltdoc="x">any</a></span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">mode-flag</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="data-structure-contracts.html#%28def._%28%28lib._racket%2Fcontract%2Fbase..rkt%29._or%2Fc%29%29" class="RktValLink" data-pltdoc="x">or/c</a></span><span class="hspace"> </span><span class="RktVal">'</span><span class="RktVal">binary</span><span class="hspace"> </span><span class="RktVal">'</span><span class="RktVal">text</span><span class="RktPn">)</span><span class="hspace"> </span>=<span class="hspace"> </span><span class="RktVal">'</span><span class="RktVal">binary</span><
|
||
|
opened port to the given procedure argument, the port is installed as
|
||
|
the current input port (see <span class="RktSym"><a href="port-ops.html#%28def._%28%28quote._~23~25kernel%29._current-input-port%29%29" class="RktValLink" data-pltdoc="x">current-input-port</a></span>) using
|
||
|
<span class="RktSym"><a href="parameters.html#%28form._%28%28lib._racket%2Fprivate%2Fmore-scheme..rkt%29._parameterize%29%29" class="RktStxLink" data-pltdoc="x">parameterize</a></span> around the call to <span class="RktVar">thunk</span>.</div></p><p><div class="SIntrapara">Examples:</div><div class="SIntrapara"><blockquote class="SCodeFlow"><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="stt">> </span><span class="RktPn">(</span><span class="RktSym"><a href="file-ports.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._with-output-to-file%29%29" class="RktValLink" data-pltdoc="x">with-output-to-file</a></span><span class="hspace"> </span><span class="RktSym">some-file</span></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="lambda.html#%28form._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._lambda%29%29" class="RktStxLink" data-pltdoc="x">lambda</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktPn">)</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="Writing.html#%28def._%28%28quote._~23~25kernel%29._printf%29%29" class="RktValLink" data-pltdoc="x">printf</a></span><span class="hspace"> </span><span class="RktVal">"hello"</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr></table></td></tr><tr><td><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="stt">> </span><span class="RktPn">(</span><span class="RktSym"><a href="file-ports.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._with-input-from-file%29%29" class="RktValLink" data-pltdoc="x">with-input-from-file</a></span><span class="hspace"> </span><span class="RktSym">some-file</span></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="lambda.html#%28form._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._lambda%29%29" class="RktStxLink" data-pltdoc="x">lambda</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktPn">)</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="Byte_and_String_Input.html#%28def._%28%28quote._~23~25kernel%29._read-string%29%29" class="RktValLink" data-pltdoc="x">read-string</a></span><span class="hspace"> </span><span class="RktVal">5</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr></table></td></tr><tr><td><p><span class="RktRes">"hello"</span></p></td></tr></table></blockquote></div></p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>procedure</p></div></div><table cellspacing="0" cellpadding="0" class="prototype RForeground"><tr><td valign="top"><span class="RktPn">(</span><a name="(def._((lib._racket/private/base..rkt)._with-output-to-file))"></a><span title="Provided from: racket/base, racket | Package: base"><span class="RktSym"><a href="file-ports.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._with-output-to-file%29%29" class="RktValDef RktValLink" data-pltdoc="x">with-output-to-file</a></span></span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="RktVar">path</span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span></td></tr><tr><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="RktVar">thunk</span></td><td valign="top"><span class="hspac
|
||
|
opened port to the given procedure argument, the port is installed as
|
||
|
the current output port (see <span class="RktSym"><a href="port-ops.html#%28def._%28%28quote._~23~25kernel%29._current-output-port%29%29" class="RktValLink" data-pltdoc="x">current-output-port</a></span>) using
|
||
|
<span class="RktSym"><a href="parameters.html#%28form._%28%28lib._racket%2Fprivate%2Fmore-scheme..rkt%29._parameterize%29%29" class="RktStxLink" data-pltdoc="x">parameterize</a></span> around the call to <span class="RktVar">thunk</span>.</div></p><p><div class="SIntrapara">Examples:</div><div class="SIntrapara"><blockquote class="SCodeFlow"><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="stt">> </span><span class="RktPn">(</span><span class="RktSym"><a href="file-ports.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._with-output-to-file%29%29" class="RktValLink" data-pltdoc="x">with-output-to-file</a></span><span class="hspace"> </span><span class="RktSym">some-file</span></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="lambda.html#%28form._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._lambda%29%29" class="RktStxLink" data-pltdoc="x">lambda</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktPn">)</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="Writing.html#%28def._%28%28quote._~23~25kernel%29._printf%29%29" class="RktValLink" data-pltdoc="x">printf</a></span><span class="hspace"> </span><span class="RktVal">"hello"</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr></table></td></tr><tr><td><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="stt">> </span><span class="RktPn">(</span><span class="RktSym"><a href="file-ports.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._with-input-from-file%29%29" class="RktValLink" data-pltdoc="x">with-input-from-file</a></span><span class="hspace"> </span><span class="RktSym">some-file</span></td></tr><tr><td><span class="hspace"> </span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="lambda.html#%28form._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._lambda%29%29" class="RktStxLink" data-pltdoc="x">lambda</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktPn">)</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="Byte_and_String_Input.html#%28def._%28%28quote._~23~25kernel%29._read-string%29%29" class="RktValLink" data-pltdoc="x">read-string</a></span><span class="hspace"> </span><span class="RktVal">5</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr></table></td></tr><tr><td><p><span class="RktRes">"hello"</span></p></td></tr></table></blockquote></div></p><p class="SHistory">Changed in version 8.1.0.3 of package <span class="stt">base</span>: Added the <span class="RktPn">#:permissions</span> argument.</p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>procedure</p></div></div><p class="RForeground"><span class="RktPn">(</span><a name="(def._((quote._~23~25kernel)._port-try-file-lock~3f))"></a><span title="Provided from: racket/base, racket | Package: base"><span class="RktSym"><a href="file-ports.html#%28def._%28%28quote._~23~25kernel%29._port-try-file-lock~3f%29%29" class="RktValDef RktValLink" data-pltdoc="x">port-try-file-lock?</a></span></span><span class="hspace"> </span><span class="RktVar">port</span><span class="hspace"> </span><span class="RktVar">mode</span><span class="RktPn">)</span><span class="hspace"> </span>→<span class="hspace"> </span><span class="RktSym"><a href="booleans.html#%28def._%28%28quote._~23~25kernel%29._boolean~3f%29%29" class="RktValLink" data-pltdoc="x">boolean?</a></span></p></blockquote></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">
|
||
|
facilities for file locking. Multiple processes can acquire a
|
||
|
<span class="RktVal">'</span><span class="RktVal">shared</span> lock on a file, but at most one process can hold an
|
||
|
<span class="RktVal">'</span><span class="RktVal">exclusive</span> lock, and <span class="RktVal">'</span><span class="RktVal">shared</span> and <span class="RktVal">'</span><span class="RktVal">exclusive</span>
|
||
|
locks are mutually exclusive. When <span class="RktVar">mode</span> is <span class="RktVal">'</span><span class="RktVal">shared</span>,
|
||
|
then <span class="RktVar">port</span> must be an input port; when <span class="RktVar">mode</span> is
|
||
|
<span class="RktVal">'</span><span class="RktVal">exclusive</span>, then <span class="RktVar">port</span> must be an output port.</div></p><p>The result is <span class="RktVal">#t</span> if the requested lock is acquired,
|
||
|
<span class="RktVal">#f</span> otherwise. When a lock is acquired, it is held until
|
||
|
either it is released with <span class="RktSym"><a href="file-ports.html#%28def._%28%28quote._~23~25kernel%29._port-file-unlock%29%29" class="RktValLink" data-pltdoc="x">port-file-unlock</a></span> or the port is closed
|
||
|
(perhaps because the process terminates).</p><p>Depending on the platform, locks may be merely advisory (i.e., locks
|
||
|
affect only the ability of processes to acquire locks) or they may
|
||
|
correspond to mandatory locks that prevent reads and writes to the
|
||
|
locked file. Specifically, locks are mandatory on Windows and advisory
|
||
|
on other platforms. Multiple tries for a <span class="RktVal">'</span><span class="RktVal">shared</span> lock on a
|
||
|
single port can succeed; on Unix and Mac OS, a single
|
||
|
<span class="RktSym"><a href="file-ports.html#%28def._%28%28quote._~23~25kernel%29._port-file-unlock%29%29" class="RktValLink" data-pltdoc="x">port-file-unlock</a></span> release the lock, while on other Windows, a
|
||
|
<span class="RktSym"><a href="file-ports.html#%28def._%28%28quote._~23~25kernel%29._port-file-unlock%29%29" class="RktValLink" data-pltdoc="x">port-file-unlock</a></span> is needed for each successful
|
||
|
<span class="RktSym"><a href="file-ports.html#%28def._%28%28quote._~23~25kernel%29._port-try-file-lock~3f%29%29" class="RktValLink" data-pltdoc="x">port-try-file-lock?</a></span>. On Unix and Mac OS, multiple tries for
|
||
|
a <span class="RktVal">'</span><span class="RktVal">exclusive</span> lock can succeed and a single
|
||
|
<span class="RktSym"><a href="file-ports.html#%28def._%28%28quote._~23~25kernel%29._port-file-unlock%29%29" class="RktValLink" data-pltdoc="x">port-file-unlock</a></span> releases the lock, while on Windows, a try
|
||
|
for an <span class="RktVal">'</span><span class="RktVal">exclusive</span> lock fails for a given port if the port
|
||
|
already holds the lock.</p><p>A lock acquired for an input port from <span class="RktSym"><a href="file-ports.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._open-input-output-file%29%29" class="RktValLink" data-pltdoc="x">open-input-output-file</a></span>
|
||
|
can be released through <span class="RktSym"><a href="file-ports.html#%28def._%28%28quote._~23~25kernel%29._port-file-unlock%29%29" class="RktValLink" data-pltdoc="x">port-file-unlock</a></span> on the corresponding
|
||
|
output port, and vice versa. If the output port from
|
||
|
<span class="RktSym"><a href="file-ports.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._open-input-output-file%29%29" class="RktValLink" data-pltdoc="x">open-input-output-file</a></span> holds an <span class="RktVal">'</span><span class="RktVal">exclusive</span> lock, the
|
||
|
corresponding input port can still acquire a <span class="RktVal">'</span><span class="RktVal">shared</span> lock,
|
||
|
even multiple times; on Windows, a <span class="RktSym"><a href="file-ports.html#%28def._%28%28quote._~23~25kernel%29._port-file-unlock%29%29" class="RktValLink" data-pltdoc="x">port-file-unlock</a></span> is needed
|
||
|
for each successful lock try, while a single <span class="RktSym"><a href="file-ports.html#%28def._%28%28quote._~23~25kernel%29._port-file-unlock%29%29" class="RktValLink" data-pltdoc="x">port-file-unlock</a></span>
|
||
|
balances the lock tries on Unix and Mac OS. A <span class="RktVal">'</span><span class="RktVal">shared</span> lock on
|
||
|
an input port can be upgraded to an <span class="RktVal">'</span><span class="RktVal">exclusive</span> lock through the
|
||
|
corresponding output port on Unix and Mac OS, in which case a single
|
||
|
<span class="RktSym"><a href="file-ports.html#%28def._%28%28quote._~23~25kernel%29._port-file-unlock%29%29" class="RktValLink" data-pltdoc="x">port-file-unlock</a></span> (on either port) releases the lock, while
|
||
|
such upgrades are not allowed on Windows.</p><p>Locking is normally supported only for file ports, and attempting to
|
||
|
acquire a lock with other kinds of file-stream ports raises an
|
||
|
<span class="RktSym"><a href="exns.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._exn~3afail~3afilesystem%29%29" class="RktValLink" data-pltdoc="x">exn:fail:filesystem</a></span> exception.</p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>procedure</p></div></div><p class="RForeground"><span class="RktPn">(</span><a name="(def._((quote._~23~25kernel)._port-file-unlock))"></a><span title="Provided from: racket/base, racket | Package: base"><span class="RktSym"><a href="file-ports.html#%28def._%28%28quote._~23~25kernel%29._port-file-unlock%29%29" class="RktValDef RktValLink" data-pltdoc="x">port-file-unlock</a></span></span><span class="hspace"> </span><span class="RktVar">port</span><span class="RktPn">)</span><span class="hspace"> </span>→<span class="hspace"> </span><span class="RktSym"><a href="void.html#%28def._%28%28quote._~23~25kernel%29._void~3f%29%29" class="RktValLink" data-pltdoc="x">void?</a></span></p></blockquote></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">port</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="port-ops.html#%28def._%28%28quote._~23~25kernel%29._file-stream-port~3f%29%29" class="RktValLink" data-pltdoc="x">file-stream-port?</a></span></td></tr></table></blockquote></div><div class="SIntrapara">Releases a lock held by the current process on the file of
|
||
|
<span class="RktVar">port</span>.</div></p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>procedure</p></div></div><p class="RForeground"><span class="RktPn">(</span><a name="(def._((quote._~23~25kernel)._port-file-identity))"></a><span title="Provided from: racket/base, racket | Package: base"><span class="RktSym"><a href="file-ports.html#%28def._%28%28quote._~23~25kernel%29._port-file-identity%29%29" class="RktValDef RktValLink" data-pltdoc="x">port-file-identity</a></span></span><span class="hspace"> </span><span class="RktVar">port</span><span class="RktPn">)</span><span class="hspace"> </span>→<span class="hspace"> </span><span class="RktSym"><a href="number-types.html#%28def._%28%28quote._~23~25kernel%29._exact-positive-integer~3f%29%29" class="RktValLink" data-pltdoc="x">exact-positive-integer?</a></span></p></blockquote></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">port</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="port-ops.html#%28def._%28%28quote._~23~25kernel%29._file-stream-port~3f%29%29" class="RktValLink" data-pltdoc="x">file-stream-port?</a></span></td></tr></table></blockquote></div><div class="SIntrapara"><a name="(idx._(gentag._261._(lib._scribblings/reference/reference..scrbl)))"></a>Returns a number that represents
|
||
|
the identity of the device and file read or written by
|
||
|
<span class="RktVar">port</span>. For two ports whose open times overlap, the
|
||
|
result of <span class="RktSym"><a href="file-ports.html#%28def._%28%28quote._~23~25kernel%29._port-file-identity%29%29" class="RktValLink" data-pltdoc="x">port-file-identity</a></span> is the same for both ports if
|
||
|
and only if the ports access the same device and file. For ports whose
|
||
|
open times do not overlap, no guarantee can be provided for the port
|
||
|
identities (even if the ports actually access the same file)—<wbr></wbr>except
|
||
|
as can be inferred through relationships with other ports. If
|
||
|
<span class="RktVar">port</span> is closed, the <span class="RktSym"><a href="exns.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._exn~3afail%29%29" class="RktValLink" data-pltdoc="x">exn:fail</a></span> exception is raised. On
|
||
|
Windows 95, 98, and Me, if <span class="RktVar">port</span> is connected to a
|
||
|
pipe instead of a file, the <span class="RktSym"><a href="exns.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._exn~3afail~3afilesystem%29%29" class="RktValLink" data-pltdoc="x">exn:fail:filesystem</a></span> exception is raised.</div></p><p><div class="SIntrapara">Examples:</div><div class="SIntrapara"><blockquote class="SCodeFlow"><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="stt">> </span><span class="RktPn">(</span><span class="RktSym"><a href="define.html#%28form._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._define%29%29" class="RktStxLink" data-pltdoc="x">define</a></span><span class="hspace"> </span><span class="RktSym">file1</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="file-ports.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._open-output-file%29%29" class="RktValLink" data-pltdoc="x">open-output-file</a></span><span class="hspace"> </span><span class="RktSym">some-file</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="stt">> </span><span class="RktPn">(</span><span class="RktSym"><a href="define.html#%28form._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._define%29%29" class="RktStxLink" data-pltdoc="x">define</a></span><span class="hspace"> </span><span class="RktSym">file2</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="file-ports.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._open-output-file%29%29" class="RktValLink" data-pltdoc="x">open-output-file</a></span><span class="hspace"> </span><span class="RktSym">some-other-file</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="stt">> </span><span class="RktPn">(</span><span class="RktSym"><a href="file-ports.html#%28def._%28%28quote._~23~25kernel%29._port-file-identity%29%29" class="RktValLink" data-pltdoc="x">port-file-identity</a></span><span class="hspace"> </span><span class="RktSym">file1</span><span class="RktPn">)</span></td></tr><tr><td><p><span class="RktRes">7653369648741355870027010</span></p></td></tr><tr><td><span class="stt">> </span><span class="RktPn">(</span><span class="RktSym"><a href="file-ports.html#%28def._%28%28quote._~23~25kernel%29._port-file-identity%29%29" class="RktValLink" data-pltdoc="x">port-file-identity</a></span><span class="hspace"> </span><span class="RktSym">file2</span><span class="RktPn">)</span></td></tr><tr><td><p><span class="RktRes">7653388095485429579578626</span></p></td></tr><tr><td><span class="stt">> </span><span class="RktPn">(</span><span class="RktSym"><a href="port-ops.html#%28def._%28%28quote._~23~25kernel%29._close-output-port%29%29" class="RktValLink" data-pltdoc="x">close-output-port</a></span><span class="hspace"> </span><span class="RktSym">file1</span><span class="RktPn">)</span></td></tr><tr><td><span class="stt">> </span><span class="RktPn">(</span><span class="RktSym"><a href="port-ops.html#%28def._%28%28quote._~23~25kernel%29._close-output-port%29%29" class="RktValLink" data-pltdoc="x">close-output-port</a></span><span class="hspace"> </span><span class="RktSym">file2</span><span class="RktPn">)</span></td></tr></table></blockquote></div></p><div class="navsetbottom"><span class="navleft"><form class="searchform"><input class="searchbox" id="searchbox" type="text" tabindex="1" placeholder="...search manuals..." title="Enter a search string to search the manuals" onkeypress="return DoSearchKey(event, this, "8.6", "../");"/></form> <a href="https://docs.racket-lang.org/index.html" title="up to the documentation top" data-pltdoc="x" onclick="return GotoPLTRoot("8.6");">top</a><span class="tocsettoggle"> <a href="javascript:void(0);" title="show/hide table of contents" onclick="TocsetToggle();">contents</a></span></span><span class="navright"> <a href="linecol.html" title="backward to "13.1.4 Counting Positions, Lines, and Columns"" data-
|