245 lines
No EOL
55 KiB
HTML
245 lines
No EOL
55 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>15.1.4 Windows Paths</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="tocviewlink" 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="tocviewselflink" 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="tocviewlink" data-pltdoc="x">Running Racket</a></td></tr><tr><td align="right"></td><td><a href="doc-bibliography.html" class="tocviewlink" data-pltdoc="x">Bibliography</a></td></tr><tr><td align="right"></td><td><a href="doc-index.html" class="tocviewlink" data-pltdoc="x">Index</a></td></tr></table></div></div><div class="tocviewlist"><table cellspacing="0" cellpadding="0"><tr><td style="width: 1em;"><a href="javascript:void(0);" title="Expand/Collapse" class="tocviewtoggle" onclick="TocviewToggle(this,"tocview_1");">►</a></td><td>15 </td><td><a href="os.html" class="tocviewlink" data-pltdoc="x">Operating System</a></td></tr></table><div class="tocviewsublist" style="display: none;" id="tocview_1"><table cellspacing="0" cellpadding="0"><tr><td align="right">15.1 </td><td><a href="pathutils.html" class="tocviewselflink" data-pltdoc="x">Paths</a></td></tr><tr><td align="right">15.2 </td><td><a href="Filesystem.html" class="tocviewlink" data-pltdoc="x">Filesystem</a></td></tr><tr><td align="right">15.3 </td><td><a href="networking.html" class="tocviewlink" data-pltdoc="x">Networking</a></td></tr><tr><td align="right">15.4 </td><td><a href="subprocess.html" class="tocviewlink" data-pltdoc="x">Processes</a></td></tr><tr><td align="right">15.5 </td><td><a href="logging.html" class="tocviewlink" data-pltdoc="x">Logging</a></td></tr><tr><td align="right">15.6 </td><td><a href="time.html" class="tocviewlink" data-pltdoc="x">Time</a></td></tr><tr><td align="right">15.7 </td><td><a href="envvars.html" class="tocviewlink" data-pltdoc="x">Environment Variables</a></td></tr><tr><td align="right">15.8 </td><td><a href="runtime.html" class="tocviewlink" data-pltdoc="x">Environment and Runtime Information</a></td></tr><tr><td align="right">15.9 </td><td><a href="Command-Line_Parsing.html" class="tocviewlink" data-pltdoc="x">Command-<wbr></wbr>Line Parsing</a></td></tr><tr><td align="right">15.10 </td><td><a href="os-lib.html" class="tocviewlink" data-pltdoc="x">Additional Operating System Functions</a></td></tr></table></div></div><div class="tocviewlist"><table cellspacing="0" cellpadding="0"><tr><td style="width: 1em;"><a href="javascript:void(0);" title="Expand/Collapse" class="tocviewtoggle" onclick="TocviewToggle(this,"tocview_2");">▼</a></td><td>15.1 </td><td><a href="pathutils.html" class="tocviewlink" data-pltdoc="x">Paths</a></td></tr></table><div class="tocviewsublist" style="display: block;" id="tocview_2"><table cellspacing="0" cellpadding="0"><tr><td align="right">15.1.1 </td><td><a href="Manipulating_Paths.html" class="tocviewlink" data-pltdoc="x">Manipulating Paths</a></td></tr><tr><td align="right">15.1.2 </td><td><a href="More_Path_Utilities.html" class="tocviewlink" data-pltdoc="x">More Path Utilities</a></td></tr><tr><td align="right">15.1.3 </td><td><a href="unixpaths.html" class="tocviewlink" data-pltdoc="x">Unix and Mac OS Paths</a></td></tr><tr><td align="right">15.1.4 </td><td><a href="windowspaths.html" class="tocviewselflink" data-pltdoc="x">Windows Paths</a></td></tr></table></div></div><div class="tocviewlist"><table cellspacing="0" cellpadding="0"><tr><td style="width: 1em;"><a href="javascript:void(0);" title="Expand/Collapse" class="tocviewtoggle" onclick="TocviewToggle(this,"tocview_3");">►</a></td><td>15.1.4 </td><td><a href="windowspaths.html" class="tocviewselflink" data-pltdoc="x">Windows Paths</a></td></tr></table><div class="tocviewsublistbottom" style="display: none;" id="tocview_3"><table cellspacing="0" cellpadding="0"><tr><td align="right">15.1.4.1 </td><td><a href="windowspaths.html#%28part._windowspathrep%29" class="tocviewlink" data-pltdoc="x">Windows Path Representation</a></td></tr></table></div></div></div><div class="tocsub"><div class="tocsubtitle">On this page:</div><table class="tocsublist" cellspacing="0"><tr><td><span class="tocsublinknumber">15.1.4.1<tt> </tt></span><a href="windowspaths.html#%28part._windowspathrep%29" class="tocsubseclink" data-pltdoc="x">Windows Path Representation</a></td></tr></table></div></div><div class="maincolumn"><div class="main"><div class="navsettop"><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="unixpaths.html" title="backward to "15.1.3 Unix and Mac OS Paths"" data-pltdoc="x">← prev</a> <a href="pathutils.html" title="up to "15.1 Paths"" data-pltdoc="x">up</a> <a href="Filesystem.html" title="forward to "15.2 Filesystem"" data-pltdoc="x">next →</a></span> </div><h5 x-source-module="(lib "scribblings/reference/reference.scrbl")" x-source-pkg="racket-doc" x-part-tag=""windowspaths"">15.1.4<tt> </tt><a name="(part._windowspaths)"></a>Windows Paths</h5><p>In general, a Windows pathname consists of an optional drive specifier
|
|
and a drive-specific path. A Windows path can be <span style="font-style: italic">absolute</span>
|
|
but still relative to the current drive; such paths start with a
|
|
<span class="RktInBG"><span class="hspace"></span><span class="RktIn">/</span><span class="hspace"></span></span> or <span class="RktInBG"><span class="hspace"></span><span class="RktIn">\</span><span class="hspace"></span></span> separator and are not UNC paths or paths
|
|
that start with <span class="RktInBG"><span class="hspace"></span><span class="RktIn">\\?\</span><span class="hspace"></span></span>.</p><p>A path that starts with a drive specification is <span style="font-style: italic">complete</span>.
|
|
Roughly, a drive specification is either a Latin letter followed by a
|
|
colon, a UNC path of the form
|
|
<span class="RktInBG"><span class="hspace"></span><span class="RktIn">\\</span><span class="hspace"></span></span><span class="sroman">‹<span style="font-style: italic">machine</span>›</span><span class="RktInBG"><span class="hspace"></span><span class="RktIn">\</span><span class="hspace"></span></span><span class="sroman">‹<span style="font-style: italic">volume</span>›</span>, or a
|
|
<span class="RktInBG"><span class="hspace"></span><span class="RktIn">\\?\</span><span class="hspace"></span></span> form followed by something other than
|
|
<span class="RktInBG"><span class="hspace"></span><span class="RktIn">REL\</span><span class="hspace"></span></span><span class="sroman">‹<span style="font-style: italic">element</span>›</span>, or
|
|
<span class="RktInBG"><span class="hspace"></span><span class="RktIn">RED\</span><span class="hspace"></span></span><span class="sroman">‹<span style="font-style: italic">element</span>›</span>. (Variants of <span class="RktInBG"><span class="hspace"></span><span class="RktIn">\\?\</span><span class="hspace"></span></span>
|
|
paths are described further below.)</p><p>Racket fails to implement the usual Windows path syntax in one
|
|
way. Outside of Racket, a pathname <span class="stt">"C:rant.txt"</span> can be a
|
|
drive-specific relative path. That is, it names a file <span class="stt">"rant.txt"</span>
|
|
on drive <span class="stt">"C:"</span>, but the complete path to the file is determined by
|
|
the current working directory for drive <span class="stt">"C:"</span>. Racket does not
|
|
support drive-specific working directories (only a working directory
|
|
across all drives, as reflected by the <span class="RktSym"><a href="Filesystem.html#%28def._%28%28quote._~23~25kernel%29._current-directory%29%29" class="RktValLink" data-pltdoc="x">current-directory</a></span>
|
|
parameter). Consequently, Racket implicitly converts a path like
|
|
<span class="stt">"C:rant.txt"</span> into <span class="stt">"C:\rant.txt"</span>.</p><ul><li><p><span style="font-style: italic">Racket-specific:</span> Whenever a path starts with a drive specifier
|
|
<span class="sroman">‹<span style="font-style: italic">letter</span>›</span><span class="RktInBG"><span class="hspace"></span><span class="RktIn">:</span><span class="hspace"></span></span> that is not followed by a
|
|
<span class="RktInBG"><span class="hspace"></span><span class="RktIn">/</span><span class="hspace"></span></span> or <span class="RktInBG"><span class="hspace"></span><span class="RktIn">\</span><span class="hspace"></span></span>, a <span class="RktInBG"><span class="hspace"></span><span class="RktIn">\</span><span class="hspace"></span></span> is inserted as
|
|
the path is <a href="pathutils.html#%28tech._cleanse%29" class="techoutside" data-pltdoc="x"><span class="techinside">cleanse</span></a>d.</p></li></ul><p>Otherwise, Racket follows standard Windows path conventions, but also
|
|
adds <span class="RktInBG"><span class="hspace"></span><span class="RktIn">\\?\REL</span><span class="hspace"></span></span> and <span class="RktInBG"><span class="hspace"></span><span class="RktIn">\\?\RED</span><span class="hspace"></span></span> conventions to
|
|
deal with paths inexpressible in the standard convention, plus
|
|
conventions to deal with excessive <span class="RktInBG"><span class="hspace"></span><span class="RktIn">\</span><span class="hspace"></span></span>s in <span class="RktInBG"><span class="hspace"></span><span class="RktIn">\\?\</span><span class="hspace"></span></span>
|
|
paths.</p><p>In the following, <span class="sroman">‹<span style="font-style: italic">letter</span>›</span> stands for a Latin letter (case
|
|
does not matter), <span class="sroman">‹<span style="font-style: italic">machine</span>›</span> stands for any sequence of
|
|
characters that does not include <span class="RktInBG"><span class="hspace"></span><span class="RktIn">\</span><span class="hspace"></span></span> or <span class="RktInBG"><span class="hspace"></span><span class="RktIn">/</span><span class="hspace"></span></span> and is
|
|
not <span class="RktInBG"><span class="hspace"></span><span class="RktIn">?</span><span class="hspace"></span></span>, <span class="sroman">‹<span style="font-style: italic">volume</span>›</span> stands for any sequence of
|
|
characters that does not include <span class="RktInBG"><span class="hspace"></span><span class="RktIn">\</span><span class="hspace"></span></span> or <span class="RktInBG"><span class="hspace"></span><span class="RktIn">/</span><span class="hspace"></span></span> , and
|
|
<span class="sroman">‹<span style="font-style: italic">element</span>›</span> stands for any sequence of characters that does not
|
|
include <span class="RktInBG"><span class="hspace"></span><span class="RktIn">\</span><span class="hspace"></span></span>.</p><ul><li><p>Trailing spaces and <span class="RktInBG"><span class="hspace"></span><span class="RktIn">.</span><span class="hspace"></span></span> in a path element are ignored
|
|
when the element is the last one in the path, unless the path
|
|
starts with <span class="RktInBG"><span class="hspace"></span><span class="RktIn">\\?\</span><span class="hspace"></span></span> or the element consists of only
|
|
spaces and <span class="RktInBG"><span class="hspace"></span><span class="RktIn">.</span><span class="hspace"></span></span>s.</p></li><li><p>The following special “files”, which access devices, exist in
|
|
all directories, case-insensitively, and with all possible
|
|
endings after a period or colon, except in pathnames that start
|
|
with <span class="RktInBG"><span class="hspace"></span><span class="RktIn">\\?\</span><span class="hspace"></span></span>: <a name="(idx._(gentag._293._(lib._scribblings/reference/reference..scrbl)))"></a><span class="stt">"NUL"</span>, <a name="(idx._(gentag._294._(lib._scribblings/reference/reference..scrbl)))"></a><span class="stt">"CON"</span>,
|
|
<a name="(idx._(gentag._295._(lib._scribblings/reference/reference..scrbl)))"></a><span class="stt">"PRN"</span>, <a name="(idx._(gentag._296._(lib._scribblings/reference/reference..scrbl)))"></a><span class="stt">"AUX"</span>, <a name="(idx._(gentag._297._(lib._scribblings/reference/reference..scrbl)))"></a><span class="stt">"COM1"</span>,
|
|
<a name="(idx._(gentag._298._(lib._scribblings/reference/reference..scrbl)))"></a><span class="stt">"COM2"</span>, <a name="(idx._(gentag._299._(lib._scribblings/reference/reference..scrbl)))"></a><span class="stt">"COM3"</span>, <a name="(idx._(gentag._300._(lib._scribblings/reference/reference..scrbl)))"></a><span class="stt">"COM4"</span>,
|
|
<a name="(idx._(gentag._301._(lib._scribblings/reference/reference..scrbl)))"></a><span class="stt">"COM5"</span>, <a name="(idx._(gentag._302._(lib._scribblings/reference/reference..scrbl)))"></a><span class="stt">"COM6"</span>, <a name="(idx._(gentag._303._(lib._scribblings/reference/reference..scrbl)))"></a><span class="stt">"COM7"</span>,
|
|
<a name="(idx._(gentag._304._(lib._scribblings/reference/reference..scrbl)))"></a><span class="stt">"COM8"</span>, <a name="(idx._(gentag._305._(lib._scribblings/reference/reference..scrbl)))"></a><span class="stt">"COM9"</span>, <a name="(idx._(gentag._306._(lib._scribblings/reference/reference..scrbl)))"></a><span class="stt">"LPT1"</span>,
|
|
<a name="(idx._(gentag._307._(lib._scribblings/reference/reference..scrbl)))"></a><span class="stt">"LPT2"</span>, <a name="(idx._(gentag._308._(lib._scribblings/reference/reference..scrbl)))"></a><span class="stt">"LPT3"</span>, <a name="(idx._(gentag._309._(lib._scribblings/reference/reference..scrbl)))"></a><span class="stt">"LPT4"</span>,
|
|
<a name="(idx._(gentag._310._(lib._scribblings/reference/reference..scrbl)))"></a><span class="stt">"LPT5"</span>, <a name="(idx._(gentag._311._(lib._scribblings/reference/reference..scrbl)))"></a><span class="stt">"LPT6"</span>, <a name="(idx._(gentag._312._(lib._scribblings/reference/reference..scrbl)))"></a><span class="stt">"LPT7"</span>,
|
|
<a name="(idx._(gentag._313._(lib._scribblings/reference/reference..scrbl)))"></a><span class="stt">"LPT8"</span>, <a name="(idx._(gentag._314._(lib._scribblings/reference/reference..scrbl)))"></a><span class="stt">"LPT9"</span>.</p></li><li><p>Except for <span class="RktInBG"><span class="hspace"></span><span class="RktIn">\\?\</span><span class="hspace"></span></span> paths, <span class="RktInBG"><span class="hspace"></span><span class="RktIn">/</span><span class="hspace"></span></span>s are
|
|
equivalent to <span class="RktInBG"><span class="hspace"></span><span class="RktIn">\</span><span class="hspace"></span></span>s. Except for <span class="RktInBG"><span class="hspace"></span><span class="RktIn">\\?\</span><span class="hspace"></span></span>
|
|
paths and the start of UNC paths, multiple adjacent
|
|
<span class="RktInBG"><span class="hspace"></span><span class="RktIn">/</span><span class="hspace"></span></span>s and <span class="RktInBG"><span class="hspace"></span><span class="RktIn">\</span><span class="hspace"></span></span>s count as a single
|
|
<span class="RktInBG"><span class="hspace"></span><span class="RktIn">\</span><span class="hspace"></span></span>. In a path that starts <span class="RktInBG"><span class="hspace"></span><span class="RktIn">\\?\</span><span class="hspace"></span></span>
|
|
paths, elements can be separated by either a single or double
|
|
<span class="RktInBG"><span class="hspace"></span><span class="RktIn">\</span><span class="hspace"></span></span>.</p></li><li><p>A directory can be accessed with or without a trailing
|
|
separator. In the case of a non-<span class="RktInBG"><span class="hspace"></span><span class="RktIn">\\?\</span><span class="hspace"></span></span> path, the
|
|
trailing separator can be any number of <span class="RktInBG"><span class="hspace"></span><span class="RktIn">/</span><span class="hspace"></span></span>s and
|
|
<span class="RktInBG"><span class="hspace"></span><span class="RktIn">\</span><span class="hspace"></span></span>s; in the case of a <span class="RktInBG"><span class="hspace"></span><span class="RktIn">\\?\</span><span class="hspace"></span></span> path, a
|
|
trailing separator must be a single <span class="RktInBG"><span class="hspace"></span><span class="RktIn">\</span><span class="hspace"></span></span>, except that
|
|
two <span class="RktInBG"><span class="hspace"></span><span class="RktIn">\</span><span class="hspace"></span></span>s can follow
|
|
<span class="RktInBG"><span class="hspace"></span><span class="RktIn">\\?\</span><span class="hspace"></span></span><span class="sroman">‹<span style="font-style: italic">letter</span>›</span><span class="RktInBG"><span class="hspace"></span><span class="RktIn">:</span><span class="hspace"></span></span>.</p></li><li><p>Except for <span class="RktInBG"><span class="hspace"></span><span class="RktIn">\\?\</span><span class="hspace"></span></span> paths, a single <span class="RktInBG"><span class="hspace"></span><span class="RktIn">.</span><span class="hspace"></span></span> as a
|
|
path element means “the current directory,” and a
|
|
<span class="RktInBG"><span class="hspace"></span><span class="RktIn">..</span><span class="hspace"></span></span> as a path element means “the parent directory.”
|
|
Up-directory path elements (i.e., <span class="RktInBG"><span class="hspace"></span><span class="RktIn">..</span><span class="hspace"></span></span>) immediately
|
|
after a drive are ignored.</p></li><li><p>A pathname that starts
|
|
<span class="RktInBG"><span class="hspace"></span><span class="RktIn">\\</span><span class="hspace"></span></span><span class="sroman">‹<span style="font-style: italic">machine</span>›</span><span class="RktInBG"><span class="hspace"></span><span class="RktIn">\</span><span class="hspace"></span></span><span class="sroman">‹<span style="font-style: italic">volume</span>›</span>
|
|
(where a <span class="RktInBG"><span class="hspace"></span><span class="RktIn">/</span><span class="hspace"></span></span> can replace any <span class="RktInBG"><span class="hspace"></span><span class="RktIn">\</span><span class="hspace"></span></span>) is a UNC
|
|
path, and the starting
|
|
<span class="RktInBG"><span class="hspace"></span><span class="RktIn">\\</span><span class="hspace"></span></span><span class="sroman">‹<span style="font-style: italic">machine</span>›</span><span class="RktInBG"><span class="hspace"></span><span class="RktIn">\</span><span class="hspace"></span></span><span class="sroman">‹<span style="font-style: italic">volume</span>›</span>
|
|
counts as the drive specifier.</p></li><li><p>Normally, a path element cannot contain a character in the
|
|
range <span class="RktVal">#\x</span><span class="stt"> </span><span class="RktVal">0</span> to <span class="RktVal">#\x</span><span class="stt"> </span><span class="RktSym">1F</span> nor any of the following
|
|
characters:</p><blockquote class="SCentered"><p><span class="RktInBG"><span class="hspace"></span><span class="RktIn"><</span><span class="hspace"></span></span> <span class="RktInBG"><span class="hspace"></span><span class="RktIn">></span><span class="hspace"></span></span> <span class="RktInBG"><span class="hspace"></span><span class="RktIn">:</span><span class="hspace"></span></span> <span class="RktInBG"><span class="hspace"></span><span class="RktIn">"</span><span class="hspace"></span></span>
|
|
<span class="RktInBG"><span class="hspace"></span><span class="RktIn">/</span><span class="hspace"></span></span> <span class="RktInBG"><span class="hspace"></span><span class="RktIn">\</span><span class="hspace"></span></span> <span class="RktInBG"><span class="hspace"></span><span class="RktIn">|</span><span class="hspace"></span></span> <span class="RktInBG"><span class="hspace"></span><span class="RktIn">?</span><span class="hspace"></span></span> <span class="RktInBG"><span class="hspace"></span><span class="RktIn">*</span><span class="hspace"></span></span></p></blockquote><p>Except for <span class="RktInBG"><span class="hspace"></span><span class="RktIn">\</span><span class="hspace"></span></span>, path elements containing these
|
|
characters can be accessed using a <span class="RktInBG"><span class="hspace"></span><span class="RktIn">\\?\</span><span class="hspace"></span></span> path
|
|
(assuming that the underlying filesystem allows the
|
|
characters).</p></li><li><p>In a pathname that starts
|
|
<span class="RktInBG"><span class="hspace"></span><span class="RktIn">\\?\</span><span class="hspace"></span></span><span class="sroman">‹<span style="font-style: italic">letter</span>›</span><span class="RktInBG"><span class="hspace"></span><span class="RktIn">:\</span><span class="hspace"></span></span>, the
|
|
<span class="RktInBG"><span class="hspace"></span><span class="RktIn">\\?\</span><span class="hspace"></span></span><span class="sroman">‹<span style="font-style: italic">letter</span>›</span><span class="RktInBG"><span class="hspace"></span><span class="RktIn">:\</span><span class="hspace"></span></span> prefix
|
|
counts as the path’s drive, as long as the path does not both
|
|
contain non-drive elements and end with two consecutive
|
|
<span class="RktInBG"><span class="hspace"></span><span class="RktIn">\</span><span class="hspace"></span></span>s, and as long as the path contains no sequence
|
|
of three or more <span class="RktInBG"><span class="hspace"></span><span class="RktIn">\</span><span class="hspace"></span></span>s. Two <span class="RktInBG"><span class="hspace"></span><span class="RktIn">\</span><span class="hspace"></span></span>s can
|
|
appear in place of the <span class="RktInBG"><span class="hspace"></span><span class="RktIn">\</span><span class="hspace"></span></span> before
|
|
<span class="sroman">‹<span style="font-style: italic">letter</span>›</span>. A <span class="RktInBG"><span class="hspace"></span><span class="RktIn">/</span><span class="hspace"></span></span> cannot be used in place of a
|
|
<span class="RktInBG"><span class="hspace"></span><span class="RktIn">\</span><span class="hspace"></span></span> (but <span class="RktInBG"><span class="hspace"></span><span class="RktIn">/</span><span class="hspace"></span></span>s can be used in element names,
|
|
though the result typically does not name an actual directory
|
|
or file).</p></li><li><p>In a pathname that starts
|
|
<span class="RktInBG"><span class="hspace"></span><span class="RktIn">\\?\UNC\</span><span class="hspace"></span></span><span class="sroman">‹<span style="font-style: italic">machine</span>›</span><span class="RktInBG"><span class="hspace"></span><span class="RktIn">\</span><span class="hspace"></span></span><span class="sroman">‹<span style="font-style: italic">volume</span>›</span>,
|
|
the
|
|
<span class="RktInBG"><span class="hspace"></span><span class="RktIn">\\?\UNC\</span><span class="hspace"></span></span><span class="sroman">‹<span style="font-style: italic">machine</span>›</span><span class="RktInBG"><span class="hspace"></span><span class="RktIn">\</span><span class="hspace"></span></span><span class="sroman">‹<span style="font-style: italic">volume</span>›</span>
|
|
prefix counts as the path’s drive, as long as the path does
|
|
not end with two consecutive <span class="RktInBG"><span class="hspace"></span><span class="RktIn">\</span><span class="hspace"></span></span>s, and as long as
|
|
the path contains no sequence of three or more
|
|
<span class="RktInBG"><span class="hspace"></span><span class="RktIn">\</span><span class="hspace"></span></span>s. Two <span class="RktInBG"><span class="hspace"></span><span class="RktIn">\</span><span class="hspace"></span></span>s can appear in place of
|
|
the <span class="RktInBG"><span class="hspace"></span><span class="RktIn">\</span><span class="hspace"></span></span> before <span class="RktInBG"><span class="hspace"></span><span class="RktIn">UNC</span><span class="hspace"></span></span>, the <span class="RktInBG"><span class="hspace"></span><span class="RktIn">\</span><span class="hspace"></span></span>s
|
|
after <span class="RktInBG"><span class="hspace"></span><span class="RktIn">UNC</span><span class="hspace"></span></span>, and/or the <span class="RktInBG"><span class="hspace"></span><span class="RktIn">\</span><span class="hspace"></span></span>s
|
|
after<span class="sroman">‹<span style="font-style: italic">machine</span>›</span>. The letters in the <span class="RktInBG"><span class="hspace"></span><span class="RktIn">UNC</span><span class="hspace"></span></span> part
|
|
can be uppercase or lowercase, and <span class="RktInBG"><span class="hspace"></span><span class="RktIn">/</span><span class="hspace"></span></span> cannot be used
|
|
in place of <span class="RktInBG"><span class="hspace"></span><span class="RktIn">\</span><span class="hspace"></span></span>s (but <span class="RktInBG"><span class="hspace"></span><span class="RktIn">/</span><span class="hspace"></span></span> can be used in
|
|
element names).</p></li><li><p><span style="font-style: italic">Racket-specific:</span> A pathname that starts
|
|
<span class="RktInBG"><span class="hspace"></span><span class="RktIn">\\?\REL\</span><span class="hspace"></span></span><span class="sroman">‹<span style="font-style: italic">element</span>›</span> or
|
|
<span class="RktInBG"><span class="hspace"></span><span class="RktIn">\\?\REL\\</span><span class="hspace"></span></span><span class="sroman">‹<span style="font-style: italic">element</span>›</span> is a relative
|
|
path, as long as the path does not end with two consecutive
|
|
<span class="RktInBG"><span class="hspace"></span><span class="RktIn">\</span><span class="hspace"></span></span>s, and as long as the path contains no sequence of
|
|
three or more <span class="RktInBG"><span class="hspace"></span><span class="RktIn">\</span><span class="hspace"></span></span>s. This Racket-specific path form
|
|
supports relative paths with elements that are not normally
|
|
expressible in Windows paths (e.g., a final element that ends
|
|
in a space). The <a name="(idx._(gentag._315._(lib._scribblings/reference/reference..scrbl)))"></a><span class="RktInBG"><span class="hspace"></span><span class="RktIn">REL</span><span class="hspace"></span></span> part must be exactly the three
|
|
uppercase letters, and <span class="RktInBG"><span class="hspace"></span><span class="RktIn">/</span><span class="hspace"></span></span>s cannot be used in place
|
|
of <span class="RktInBG"><span class="hspace"></span><span class="RktIn">\</span><span class="hspace"></span></span>s. If the path starts
|
|
<span class="RktInBG"><span class="hspace"></span><span class="RktIn">\\?\REL\..</span><span class="hspace"></span></span> then for as long as the
|
|
path continues with repetitions of <span class="RktInBG"><span class="hspace"></span><span class="RktIn">\..</span><span class="hspace"></span></span>,
|
|
each element counts as an up-directory element; a single
|
|
<span class="RktInBG"><span class="hspace"></span><span class="RktIn">\</span><span class="hspace"></span></span> must be used to separate the up-directory
|
|
elements. As soon as a second <span class="RktInBG"><span class="hspace"></span><span class="RktIn">\</span><span class="hspace"></span></span> is used to separate
|
|
the elements, or as soon as a non-<span class="RktInBG"><span class="hspace"></span><span class="RktIn">..</span><span class="hspace"></span></span> element is
|
|
encountered, the remaining elements are all literals (never
|
|
up-directory elements). When a <span class="RktInBG"><span class="hspace"></span><span class="RktIn">\\?\REL</span><span class="hspace"></span></span> path
|
|
value is converted to a string (or when the path value is
|
|
written or displayed), the string does not contain the
|
|
starting <span class="RktInBG"><span class="hspace"></span><span class="RktIn">\\?\REL</span><span class="hspace"></span></span> or the immediately following
|
|
<span class="RktInBG"><span class="hspace"></span><span class="RktIn">\</span><span class="hspace"></span></span>s; converting a path value to a byte string
|
|
preserves the <span class="RktInBG"><span class="hspace"></span><span class="RktIn">\\?\REL</span><span class="hspace"></span></span> prefix.</p></li><li><p><span style="font-style: italic">Racket-specific:</span> A pathname that starts
|
|
<span class="RktInBG"><span class="hspace"></span><span class="RktIn">\\?\RED\</span><span class="hspace"></span></span><span class="sroman">‹<span style="font-style: italic">element</span>›</span> or
|
|
<span class="RktInBG"><span class="hspace"></span><span class="RktIn">\\?\RED\\</span><span class="hspace"></span></span><span class="sroman">‹<span style="font-style: italic">element</span>›</span> is a
|
|
drive-relative path, as long as the path does not end with two
|
|
consecutive <span class="RktInBG"><span class="hspace"></span><span class="RktIn">\</span><span class="hspace"></span></span>s, and as long as the path contains
|
|
no sequence of three or more <span class="RktInBG"><span class="hspace"></span><span class="RktIn">\</span><span class="hspace"></span></span>s. This
|
|
Racket-specific path form supports drive-relative paths (i.e.,
|
|
absolute given a drive) with elements that are not normally
|
|
expressible in Windows paths. The <a name="(idx._(gentag._316._(lib._scribblings/reference/reference..scrbl)))"></a><span class="RktInBG"><span class="hspace"></span><span class="RktIn">RED</span><span class="hspace"></span></span> part must be
|
|
exactly the three uppercase letters, and <span class="RktInBG"><span class="hspace"></span><span class="RktIn">/</span><span class="hspace"></span></span>s cannot
|
|
be used in place of <span class="RktInBG"><span class="hspace"></span><span class="RktIn">\</span><span class="hspace"></span></span>s. Unlike
|
|
<span class="RktInBG"><span class="hspace"></span><span class="RktIn">\\?\REL</span><span class="hspace"></span></span> paths, a <span class="RktInBG"><span class="hspace"></span><span class="RktIn">..</span><span class="hspace"></span></span> element is always
|
|
a literal path element. When a <span class="RktInBG"><span class="hspace"></span><span class="RktIn">\\?\RED</span><span class="hspace"></span></span> path
|
|
value is converted to a string (or when the path value is
|
|
written or displayed), the string does not contain the
|
|
starting <span class="RktInBG"><span class="hspace"></span><span class="RktIn">\\?\RED</span><span class="hspace"></span></span> and it contains a single
|
|
starting <span class="RktInBG"><span class="hspace"></span><span class="RktIn">\</span><span class="hspace"></span></span>; converting a path value to a byte
|
|
string preserves the <span class="RktInBG"><span class="hspace"></span><span class="RktIn">\\?\RED</span><span class="hspace"></span></span> prefix.</p></li></ul><p>Three additional Racket-specific rules provide meanings to character
|
|
sequences that are otherwise ill-formed as Windows paths:</p><ul><li><p><span style="font-style: italic">Racket-specific:</span> In a pathname of the form
|
|
<span class="RktInBG"><span class="hspace"></span><span class="RktIn">\\?\</span><span class="hspace"></span></span><span class="sroman">‹<span style="font-style: italic">any</span>›</span><span class="RktInBG"><span class="hspace"></span><span class="RktIn">\\</span><span class="hspace"></span></span> where
|
|
<span class="sroman">‹<span style="font-style: italic">any</span>›</span> is any non-empty sequence of characters other
|
|
than <span class="sroman">‹<span style="font-style: italic">letter</span>›</span><span class="RktInBG"><span class="hspace"></span><span class="RktIn">:</span><span class="hspace"></span></span> or
|
|
<span class="RktInBG"><span class="hspace"></span><span class="RktIn">\</span><span class="hspace"></span></span><span class="sroman">‹<span style="font-style: italic">letter</span>›</span><span class="RktInBG"><span class="hspace"></span><span class="RktIn">:</span><span class="hspace"></span></span>, the entire path
|
|
counts as the path’s (non-existent) drive.</p></li><li><p><span style="font-style: italic">Racket-specific:</span> In a pathname of the form
|
|
<span class="RktInBG"><span class="hspace"></span><span class="RktIn">\\?\</span><span class="hspace"></span></span><span class="sroman">‹<span style="font-style: italic">any</span>›</span><span class="RktInBG"><span class="hspace"></span><span class="RktIn">\\\</span><span class="hspace"></span></span><span class="sroman">‹<span style="font-style: italic">elements</span>›</span>,
|
|
where <span class="sroman">‹<span style="font-style: italic">any</span>›</span> is any non-empty sequence of characters
|
|
and <span class="sroman">‹<span style="font-style: italic">elements</span>›</span> is any sequence that does not start
|
|
with a <span class="RktInBG"><span class="hspace"></span><span class="RktIn">\</span><span class="hspace"></span></span>, does not end with two <span class="RktInBG"><span class="hspace"></span><span class="RktIn">\</span><span class="hspace"></span></span>s,
|
|
and does not contain a sequence of three <span class="RktInBG"><span class="hspace"></span><span class="RktIn">\</span><span class="hspace"></span></span>s, then
|
|
<span class="RktInBG"><span class="hspace"></span><span class="RktIn">\\?\</span><span class="hspace"></span></span><span class="sroman">‹<span style="font-style: italic">any</span>›</span><span class="RktInBG"><span class="hspace"></span><span class="RktIn">\\</span><span class="hspace"></span></span> counts as the
|
|
path’s (non-existent) drive.</p></li><li><p><span style="font-style: italic">Racket-specific:</span> In a pathname that starts <span class="RktInBG"><span class="hspace"></span><span class="RktIn">\\?\</span><span class="hspace"></span></span> and
|
|
does not match any of the patterns from the preceding bullets,
|
|
<span class="RktInBG"><span class="hspace"></span><span class="RktIn">\\?\</span><span class="hspace"></span></span> counts as the path’s (non-existent)
|
|
drive.</p></li></ul><p>Outside of Racket, except for <span class="RktInBG"><span class="hspace"></span><span class="RktIn">\\?\</span><span class="hspace"></span></span> paths, pathnames are
|
|
typically limited to 259 characters when used as a file path and 247 characters when
|
|
used as a directory path. Racket internally converts
|
|
pathnames longer than 247 characters to <span class="RktInBG"><span class="hspace"></span><span class="RktIn">\\?\</span><span class="hspace"></span></span> form to avoid the
|
|
limits; in that case, the path is first simplified syntactically (in the
|
|
sense of <span class="RktSym"><a href="Manipulating_Paths.html#%28def._%28%28quote._~23~25kernel%29._simplify-path%29%29" class="RktValLink" data-pltdoc="x">simplify-path</a></span>). The operating system cannot access files through
|
|
<span class="RktInBG"><span class="hspace"></span><span class="RktIn">\\?\</span><span class="hspace"></span></span> paths that are longer than 32,000 characters or
|
|
so.</p><p>Where the above descriptions says “character,” substitute “byte”
|
|
for interpreting byte strings as paths. The encoding of Windows paths
|
|
into bytes preserves ASCII characters, and all special characters
|
|
mentioned above are ASCII, so all of the rules are the same.</p><p>Beware that the <span class="RktInBG"><span class="hspace"></span><span class="RktIn">\</span><span class="hspace"></span></span> path separator is an escape character
|
|
in Racket strings. Thus, the path <span class="RktInBG"><span class="hspace"></span><span class="RktIn">\\?\REL\..\\..</span><span class="hspace"></span></span> as
|
|
a string must be written <span class="RktVal">"\\\\?\\REL\\..\\\\.."</span>.</p><p>A path that ends with a directory separator syntactically refers to a
|
|
directory. In addition, a path syntactically refers to a directory if
|
|
its last element is a same-directory or up-directory indicator (not
|
|
quoted by a <span class="RktInBG"><span class="hspace"></span><span class="RktIn">\\?\</span><span class="hspace"></span></span> form), or if it refers to a root.</p><p>Even on variants of Windows that support symbolic links, up-directory
|
|
<span class="RktInBG"><span class="hspace"></span><span class="RktIn">..</span><span class="hspace"></span></span> indicators in a path are resolved syntactically, not
|
|
sensitive to links. For example, if a path ends with <span class="RktInBG"><span class="hspace"></span><span class="RktIn">d\..\f</span><span class="hspace"></span></span>
|
|
and <span class="RktInBG"><span class="hspace"></span><span class="RktIn">d</span><span class="hspace"></span></span> refers to a symbolic link that references a directory
|
|
with a different parent than <span class="RktInBG"><span class="hspace"></span><span class="RktIn">d</span><span class="hspace"></span></span>, the path nevertheless refers
|
|
to <span class="RktInBG"><span class="hspace"></span><span class="RktIn">f</span><span class="hspace"></span></span> in the same directory as <span class="RktInBG"><span class="hspace"></span><span class="RktIn">d</span><span class="hspace"></span></span>. A relative-path
|
|
link is parsed as if prefixed with <span class="RktInBG"><span class="hspace"></span><span class="RktIn">\\?\REL</span><span class="hspace"></span></span> paths, except
|
|
that <span class="RktInBG"><span class="hspace"></span><span class="RktIn">..</span><span class="hspace"></span></span> and <span class="RktInBG"><span class="hspace"></span><span class="RktIn">.</span><span class="hspace"></span></span> elements are allowed throughout the
|
|
path, and any number of redundant <span class="RktInBG"><span class="hspace"></span><span class="RktIn">\</span><span class="hspace"></span></span> separators are allowed.</p><p>Windows paths are <a href="pathutils.html#%28tech._cleanse%29" data-pltdoc="x">cleanse</a>d as follows: In paths that start
|
|
<span class="RktInBG"><span class="hspace"></span><span class="RktIn">\\?\</span><span class="hspace"></span></span>, redundant <span class="RktInBG"><span class="hspace"></span><span class="RktIn">\</span><span class="hspace"></span></span>s are removed, an extra
|
|
<span class="RktInBG"><span class="hspace"></span><span class="RktIn">\</span><span class="hspace"></span></span> is added in a <span class="RktInBG"><span class="hspace"></span><span class="RktIn">\\?\REL</span><span class="hspace"></span></span> if an extra one is
|
|
not already present to separate up-directory indicators from literal
|
|
path elements, and an extra <span class="RktInBG"><span class="hspace"></span><span class="RktIn">\</span><span class="hspace"></span></span> is similarly added after
|
|
<span class="RktInBG"><span class="hspace"></span><span class="RktIn">\\?\RED</span><span class="hspace"></span></span> if an extra one is not already present.
|
|
For other paths, multiple <span class="RktInBG"><span class="hspace"></span><span class="RktIn">/</span><span class="hspace"></span></span>s and <span class="RktInBG"><span class="hspace"></span><span class="RktIn">\</span><span class="hspace"></span></span>s are
|
|
converted to single <span class="RktInBG"><span class="hspace"></span><span class="RktIn">/</span><span class="hspace"></span></span>s or <span class="RktInBG"><span class="hspace"></span><span class="RktIn">\</span><span class="hspace"></span></span> (except at the beginning of a shared
|
|
folder name), and a <span class="RktInBG"><span class="hspace"></span><span class="RktIn">\</span><span class="hspace"></span></span> is inserted after the colon in a drive
|
|
specification if it is missing.</p><p>For <span class="RktPn">(</span><span class="RktSym"><a href="Manipulating_Paths.html#%28def._%28%28quote._~23~25kernel%29._bytes-~3epath-element%29%29" class="RktValLink" data-pltdoc="x">bytes->path-element</a></span><span class="stt"> </span><span class="RktVar">bstr</span><span class="RktPn">)</span>, <span class="RktInBG"><span class="hspace"></span><span class="RktIn">/</span><span class="hspace"></span></span>s, colons,
|
|
trailing dots, trailing whitespace, and special device names (e.g.,
|
|
“aux”) in <span class="RktVar">bstr</span> are encoded as a literal part of the path
|
|
element by using a <span class="RktInBG"><span class="hspace"></span><span class="RktIn">\\?\REL</span><span class="hspace"></span></span> prefix. The <span class="RktSym">bstr</span>
|
|
argument must not contain a <span class="RktInBG"><span class="hspace"></span><span class="RktIn">\</span><span class="hspace"></span></span>, otherwise the
|
|
<span class="RktSym"><a href="exns.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._exn~3afail~3acontract%29%29" class="RktValLink" data-pltdoc="x">exn:fail:contract</a></span> exception is raised.</p><p>For <span class="RktPn">(</span><span class="RktSym"><a href="Manipulating_Paths.html#%28def._%28%28quote._~23~25kernel%29._path-element-~3ebytes%29%29" class="RktValLink" data-pltdoc="x">path-element->bytes</a></span><span class="stt"> </span><span class="RktVar">path</span><span class="RktPn">)</span> or
|
|
<span class="RktPn">(</span><span class="RktSym"><a href="Manipulating_Paths.html#%28def._%28%28quote._~23~25kernel%29._path-element-~3estring%29%29" class="RktValLink" data-pltdoc="x">path-element->string</a></span><span class="stt"> </span><span class="RktVar">path</span><span class="RktPn">)</span>, if the byte-string form of
|
|
<span class="RktVar">path</span> starts with a <span class="RktInBG"><span class="hspace"></span><span class="RktIn">\\?\REL</span><span class="hspace"></span></span>, the prefix is not
|
|
included in the result.</p><p>For <span class="RktPn">(</span><span class="RktSym"><a href="Manipulating_Paths.html#%28def._%28%28quote._~23~25kernel%29._build-path%29%29" class="RktValLink" data-pltdoc="x">build-path</a></span><span class="stt"> </span><span class="RktVar">base-path</span><span class="stt"> </span><span class="RktVar">sub-path</span><span class="stt"> </span><span class="RktSym"><a href="stx-patterns.html#%28form._%28%28lib._racket%2Fprivate%2Fstxcase-scheme..rkt%29._......%29%29" class="RktStxLink" data-pltdoc="x">...</a></span><span class="RktPn">)</span>, trailing spaces
|
|
and periods are removed from the last element of <span class="RktVar">base-path</span>
|
|
and all but the last <span class="RktVar">sub-path</span> (unless the element consists of
|
|
only spaces and periods), except for those that start with
|
|
<span class="RktInBG"><span class="hspace"></span><span class="RktIn">\\?\</span><span class="hspace"></span></span>. If <span class="RktVar">base-path</span> starts <span class="RktInBG"><span class="hspace"></span><span class="RktIn">\\?\</span><span class="hspace"></span></span>,
|
|
then after each non-<span class="RktInBG"><span class="hspace"></span><span class="RktIn">\\?\REL\</span><span class="hspace"></span></span> and
|
|
non-<span class="RktInBG"><span class="hspace"></span><span class="RktIn">\\?\RED\</span><span class="hspace"></span></span> <span class="RktVar">sub-path</span> is added, all
|
|
<span class="RktInBG"><span class="hspace"></span><span class="RktIn">/</span><span class="hspace"></span></span>s in the addition are converted to <span class="RktInBG"><span class="hspace"></span><span class="RktIn">\</span><span class="hspace"></span></span>s,
|
|
multiple consecutive <span class="RktInBG"><span class="hspace"></span><span class="RktIn">\</span><span class="hspace"></span></span>s are converted to a single
|
|
<span class="RktInBG"><span class="hspace"></span><span class="RktIn">\</span><span class="hspace"></span></span>, added <span class="RktInBG"><span class="hspace"></span><span class="RktIn">.</span><span class="hspace"></span></span> elements are removed, and added
|
|
<span class="RktInBG"><span class="hspace"></span><span class="RktIn">..</span><span class="hspace"></span></span> elements are removed along with the preceding element;
|
|
these conversions are not performed on the original <span class="RktVar">base-path</span>
|
|
part of the result or on any <span class="RktInBG"><span class="hspace"></span><span class="RktIn">\\?\REL\</span><span class="hspace"></span></span> or
|
|
<span class="RktInBG"><span class="hspace"></span><span class="RktIn">\\?\RED\</span><span class="hspace"></span></span> or <span class="RktVar">sub-path</span>. If a
|
|
<span class="RktInBG"><span class="hspace"></span><span class="RktIn">\\?\REL\</span><span class="hspace"></span></span> or <span class="RktInBG"><span class="hspace"></span><span class="RktIn">\\?\RED\</span><span class="hspace"></span></span>
|
|
<span class="RktVar">sub-path</span> is added to a non-<span class="RktInBG"><span class="hspace"></span><span class="RktIn">\\?\</span><span class="hspace"></span></span>
|
|
<span class="RktVar">base-path</span>, the <span class="RktVar">base-path</span> (with any additions up
|
|
to the <span class="RktInBG"><span class="hspace"></span><span class="RktIn">\\?\REL\</span><span class="hspace"></span></span> or <span class="RktInBG"><span class="hspace"></span><span class="RktIn">\\?\RED\</span><span class="hspace"></span></span>
|
|
<span class="RktVar">sub-path</span>) is simplified and converted to a
|
|
<span class="RktInBG"><span class="hspace"></span><span class="RktIn">\\?\</span><span class="hspace"></span></span> path. In other cases, a <span class="RktInBG"><span class="hspace"></span><span class="RktIn">\</span><span class="hspace"></span></span> may be
|
|
added or removed before combining paths to avoid changing the root
|
|
meaning of the path (e.g., combining <span class="RktInBG"><span class="hspace"></span><span class="RktIn">//x</span><span class="hspace"></span></span> and <span class="RktInBG"><span class="hspace"></span><span class="RktIn">y</span><span class="hspace"></span></span>
|
|
produces <span class="RktInBG"><span class="hspace"></span><span class="RktIn">/x/y</span><span class="hspace"></span></span>, because <span class="RktInBG"><span class="hspace"></span><span class="RktIn">//x/y</span><span class="hspace"></span></span> would be a UNC path
|
|
instead of a drive-relative path).</p><p>For <span class="RktPn">(</span><span class="RktSym"><a href="Manipulating_Paths.html#%28def._%28%28quote._~23~25kernel%29._simplify-path%29%29" class="RktValLink" data-pltdoc="x">simplify-path</a></span><span class="stt"> </span><span class="RktVar">path</span><span class="stt"> </span><span class="RktVar">use-filesystem?</span><span class="RktPn">)</span>, <span class="RktVar">path</span> is
|
|
expanded, and if <span class="RktVar">path</span> does not start with
|
|
<span class="RktInBG"><span class="hspace"></span><span class="RktIn">\\?\</span><span class="hspace"></span></span>, trailing spaces and periods are removed, a
|
|
<span class="RktInBG"><span class="hspace"></span><span class="RktIn">/</span><span class="hspace"></span></span> is inserted after the colon in a drive specification if it
|
|
is missing, and a <span class="RktInBG"><span class="hspace"></span><span class="RktIn">\</span><span class="hspace"></span></span> is inserted after <span class="RktInBG"><span class="hspace"></span><span class="RktIn">\\?\</span><span class="hspace"></span></span>
|
|
as a root if there are elements and no extra <span class="RktInBG"><span class="hspace"></span><span class="RktIn">\</span><span class="hspace"></span></span>
|
|
already. Otherwise, if no indicators or redundant separators are in
|
|
<span class="RktVar">path</span>, then <span class="RktVar">path</span> is returned.</p><p>For <span class="RktPn">(</span><span class="RktSym"><a href="Manipulating_Paths.html#%28def._%28%28quote._~23~25kernel%29._split-path%29%29" class="RktValLink" data-pltdoc="x">split-path</a></span><span class="stt"> </span><span class="RktVar">path</span><span class="RktPn">)</span> producing <span class="RktVar">base</span>,
|
|
<span class="RktVar">name</span>, and <span class="RktVar">must-be-dir?</span>, splitting a path that does
|
|
not start with <span class="RktInBG"><span class="hspace"></span><span class="RktIn">\\?\</span><span class="hspace"></span></span> can produce parts that start with
|
|
<span class="RktInBG"><span class="hspace"></span><span class="RktIn">\\?\</span><span class="hspace"></span></span>. For example, splitting <span class="RktInBG"><span class="hspace"></span><span class="RktIn">C:/x /aux/</span><span class="hspace"></span></span> twice
|
|
produces <span class="RktInBG"><span class="hspace"></span><span class="RktIn">\\?\REL\\x</span><span class="hspace"> </span></span> and <span class="RktInBG"><span class="hspace"></span><span class="RktIn">\\?\REL\\aux</span><span class="hspace"></span></span>;
|
|
the <span class="RktInBG"><span class="hspace"></span><span class="RktIn">\\?\</span><span class="hspace"></span></span> is needed in these cases to preserve a
|
|
trailing space after <span class="RktInBG"><span class="hspace"></span><span class="RktIn">x</span><span class="hspace"></span></span> and to avoid referring to the AUX
|
|
device instead of an <span class="stt">"aux"</span> file.</p><h5 x-source-module="(lib "scribblings/reference/reference.scrbl")" x-source-pkg="racket-doc" x-part-tag=""windowspathrep"">15.1.4.1<tt> </tt><a name="(part._windowspathrep)"></a>Windows Path Representation</h5><p>A path on Windows is natively a sequence of UTF-16 code units, where
|
|
the sequence can include unpaired surrogates. This sequence is encoded
|
|
as a byte string through an extension of UTF-8, where unpaired
|
|
surrogates in the UTF-16 code-unit sequence are converted as if they
|
|
were non-surrogate values. The extended encodings are implemented on
|
|
Windows as the <span class="RktVal">"platform-UTF-16"</span> and
|
|
<span class="RktVal">"platform-UTF-8"</span> encodings for <span class="RktSym"><a href="bytestrings.html#%28def._%28%28quote._~23~25kernel%29._bytes-open-converter%29%29" class="RktValLink" data-pltdoc="x">bytes-open-converter</a></span>.</p><p>Racket’s internal representation of a Windows path is a byte string,
|
|
so that <span class="RktSym"><a href="Manipulating_Paths.html#%28def._%28%28quote._~23~25kernel%29._path-~3ebytes%29%29" class="RktValLink" data-pltdoc="x">path->bytes</a></span> and <span class="RktSym"><a href="Manipulating_Paths.html#%28def._%28%28quote._~23~25kernel%29._bytes-~3epath%29%29" class="RktValLink" data-pltdoc="x">bytes->path</a></span> are always
|
|
inverses. When converting a path to a native UTF-16 code-unit
|
|
sequence, <span class="RktVal">#\tab</span> is used in place of platform-UTF-8 decoding
|
|
errors (on the grounds that tab is normally disallowed as a character
|
|
in a Windows path, unlike <span class="RktVal">#\uFFFD</span><span class="RktMeta"></span>).</p><p>A Windows path is converted to a string by treating the platform-UTF-8
|
|
encoding as a UTF-8 encoding with <span class="RktVal">#\uFFFD</span><span class="RktMeta"></span> in place of
|
|
decoding errors. Similarly, a string is converted to a path by UTF-8
|
|
encoding (in which case no errors are possible).</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="unixpaths.html" title="backward to "15.1.3 Unix and Mac OS Paths"" data-pltdoc="x">← prev</a> <a href="pathutils.html" title="up to "15.1 Paths"" data-pltdoc="x">up</a> <a href="Filesystem.html" title="forward to "15.2 Filesystem"" data-pltdoc="x">next →</a></span> </div></div></div><div id="contextindicator"> </div></body></html> |