198 lines
19 KiB
HTML
198 lines
19 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="zh" dir="ltr" class="client-nojs" xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh">
|
|
<head><meta http-equiv="x-ua-compatible" content="ie=edge">
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
|
<title>std::filesystem::create_directory, std::filesystem::create_directories</title>
|
|
<link rel="stylesheet" href="ext.css" />
|
|
<link rel="stylesheet" href="site_modules.css" />
|
|
</head>
|
|
<body class="mediawiki ltr sitedir-ltr ns-0 ns-subject page-cpp_filesystem_create_directory skin-cppreference2 action-view cpp-navbar">
|
|
<div id="cpp-content-base">
|
|
<div id="content"><a id="top"></a>
|
|
<h1 id="firstHeading" class="firstHeading"><span style="font-size:0.7em; line-height:130%">std::filesystem::</span>create_directory, <span style="font-size:0.7em; line-height:130%">std::filesystem::</span>create_directories</h1>
|
|
<div id="bodyContent">
|
|
<div id="contentSub"><span class="subpages">< <a href="cpp.html">cpp</a>‎ | <a href="cpp-filesystem.html">filesystem</a></span></div>
|
|
<div id="mw-content-text" lang="zh" dir="ltr" class="mw-content-ltr" xml:lang="zh">
|
|
<table class="t-dcl-begin">
|
|
<tbody>
|
|
<tr class="t-dsc-header">
|
|
<td>
|
|
<div>定义于头文件 <code><a href="cpp-header-filesystem.html"><filesystem></a></code></div>
|
|
</td>
|
|
<td></td>
|
|
<td></td>
|
|
</tr>
|
|
<tr class="t-dcl t-since-cxx17">
|
|
<td>
|
|
<div><span class="mw-geshi cpp source-cpp"><span class="kw4">bool</span> create_directory<span class="br0">(</span> <span class="kw4">const</span> <a href="cpp-filesystem-path.html"><span class="kw2199">std::<span class="me2">filesystem</span><span class="sy4">::</span><span class="me2">path</span></span></a><span class="sy3">&</span> p <span class="br0">)</span><span class="sy4">;</span><br />
|
|
<span class="kw4">bool</span> create_directory<span class="br0">(</span> <span class="kw4">const</span> <a href="cpp-filesystem-path.html"><span class="kw2199">std::<span class="me2">filesystem</span><span class="sy4">::</span><span class="me2">path</span></span></a><span class="sy3">&</span> p, <a href="cpp-error-error_code.html"><span class="kw877">std::<span class="me2">error_code</span></span></a><span class="sy3">&</span> ec <span class="br0">)</span> <span class="kw1">noexcept</span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td>(1)</td>
|
|
<td><span class="t-mark-rev t-since-cxx17">(C++17 起)</span></td>
|
|
</tr>
|
|
<tr class="t-dcl t-since-cxx17">
|
|
<td>
|
|
<div><span class="mw-geshi cpp source-cpp"><span class="kw4">bool</span> create_directory<span class="br0">(</span> <span class="kw4">const</span> <a href="cpp-filesystem-path.html"><span class="kw2199">std::<span class="me2">filesystem</span><span class="sy4">::</span><span class="me2">path</span></span></a><span class="sy3">&</span> p,<br /></span>
|
|
<p> <span class="kw4">const</span> <a href="cpp-filesystem-path.html"><span class="kw2199">std::<span class="me2">filesystem</span><span class="sy4">::</span><span class="me2">path</span></span></a><span class="sy3">&</span> existing_p <span class="br0">)</span><span class="sy4">;</span><br />
|
|
<span class="kw4">bool</span> create_directory<span class="br0">(</span> <span class="kw4">const</span> <a href="cpp-filesystem-path.html"><span class="kw2199">std::<span class="me2">filesystem</span><span class="sy4">::</span><span class="me2">path</span></span></a><span class="sy3">&</span> p,<br />
|
|
<span class="kw4">const</span> <a href="cpp-filesystem-path.html"><span class="kw2199">std::<span class="me2">filesystem</span><span class="sy4">::</span><span class="me2">path</span></span></a><span class="sy3">&</span> existing_p,<br /></p>
|
|
<a href="cpp-error-error_code.html"><span class="kw877">std::<span class="me2">error_code</span></span></a><span class="sy3">&</span> ec <span class="br0">)</span> <span class="kw1">noexcept</span><span class="sy4">;</span></div>
|
|
</td>
|
|
<td>(2)</td>
|
|
<td><span class="t-mark-rev t-since-cxx17">(C++17 起)</span></td>
|
|
</tr>
|
|
<tr class="t-dcl t-since-cxx17">
|
|
<td>
|
|
<div><span class="mw-geshi cpp source-cpp"><span class="kw4">bool</span> create_directories<span class="br0">(</span> <span class="kw4">const</span> <a href="cpp-filesystem-path.html"><span class="kw2199">std::<span class="me2">filesystem</span><span class="sy4">::</span><span class="me2">path</span></span></a><span class="sy3">&</span> p <span class="br0">)</span><span class="sy4">;</span><br />
|
|
<span class="kw4">bool</span> create_directories<span class="br0">(</span> <span class="kw4">const</span> <a href="cpp-filesystem-path.html"><span class="kw2199">std::<span class="me2">filesystem</span><span class="sy4">::</span><span class="me2">path</span></span></a><span class="sy3">&</span> p, <a href="cpp-error-error_code.html"><span class="kw877">std::<span class="me2">error_code</span></span></a><span class="sy3">&</span> ec <span class="br0">)</span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td>(3)</td>
|
|
<td><span class="t-mark-rev t-since-cxx17">(C++17 起)</span></td>
|
|
</tr>
|
|
<tr class="t-dcl-sep">
|
|
<td></td>
|
|
<td></td>
|
|
<td></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<div class="t-li1"><span class="t-li">1)</span> 如同用 POSIX <a rel="nofollow" class="external text" href="http://pubs.opengroup.org/onlinepubs/9699919799/functions/mkdir.html"><code>mkdir()</code></a> 以 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw1">static_cast</span><span class="sy1"><</span><span class="kw4">int</span><span class="sy1">></span><span class="br0">(</span><a href="cpp-filesystem-perms.html"><span class="kw2233">std::<span class="me2">filesystem</span><span class="sy4">::</span><span class="me2">perms</span><span class="sy4">::</span><span class="me2">all</span></span></a><span class="br0">)</span></span></span> 为第二参数创建目录 <code>p</code> (亲目录必须已经存在)。若该函数因为 <code>p</code> 解析到既存目录而失败,则不报告错误。否则在失败时报告错误。</div>
|
|
<div class="t-li1"><span class="t-li">2)</span> 同 <span class="t-v">(1)</span> ,除了新目录的属性复制自 <code>existing_p</code> (必须是已存在的目录)。复制的属性是取决于操作系统:在 POSIX 系统上,如同按照下方复制属性
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="cpp source-cpp">
|
|
<pre class="de1">stat<span class="br0">(</span>existing_p.<span class="me1">c_str</span><span class="br0">(</span><span class="br0">)</span>, <span class="sy3">&</span>attributes_stat<span class="br0">)</span>
|
|
mkdir<span class="br0">(</span>p.<span class="me1">c_str</span><span class="br0">(</span><span class="br0">)</span>, attributes_stat.<span class="me1">st_mode</span><span class="br0">)</span></pre></div>
|
|
</div>
|
|
在 Windows 操作系统上,不复制 <code>existing_p</code> 的属性。</div>
|
|
<div class="t-li1"><span class="t-li">3)</span> 对每个尚未存在的 <code>p</code> 的元素执行 <span class="t-v">(1)</span> 。若 <code>p</code> 已存在,则函数不做任何事(不把此条件当做错误)。</div>
|
|
<h3><span class="mw-headline" id=".E5.8F.82.E6.95.B0">参数</span></h3>
|
|
<table class="t-par-begin">
|
|
<tr class="t-par">
|
|
<td>p</td>
|
|
<td>-</td>
|
|
<td>要创建的新目录的路径</td>
|
|
</tr>
|
|
<tr class="t-par">
|
|
<td>existing_p</td>
|
|
<td>-</td>
|
|
<td>要自之复制属性的目录的路径</td>
|
|
</tr>
|
|
<tr class="t-par">
|
|
<td>ec</td>
|
|
<td>-</td>
|
|
<td>不抛出重载中报告错误的输出参数</td>
|
|
</tr>
|
|
</table>
|
|
<h3><span class="mw-headline" id=".E8.BF.94.E5.9B.9E.E5.80.BC">返回值</span></h3>
|
|
<p>若创建了 <code>p</code> 所解析到的目录则为 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw2">true</span></span></span> ,否则为 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw2">false</span></span></span> 。</p>
|
|
<h3><span class="mw-headline" id=".E5.BC.82.E5.B8.B8">异常</span></h3>
|
|
<div class="t-li1"><span class="t-li">1,3)</span> 不接受 <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-error-error_code.html"><span class="kw877">std::<span class="me2">error_code</span></span></a><span class="sy3">&</span></span></span> 参数的重载在底层 OS API 错误时抛出 <a href="cpp-filesystem-filesystem_error.html"><tt>filesystem_error</tt></a> ,以第一 path 参数 <code>p</code> 和作为错误码参数的 OS 错误码构造。若 OS API 调用失败,则接受 <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-error-error_code.html"><span class="kw877">std::<span class="me2">error_code</span></span></a><span class="sy3">&</span></span></span> 参数的重载设置该参数为 OS API 错误码,而若不出现错误则执行 <span class="t-c"><span class="mw-geshi cpp source-cpp">ec.<span class="me1">clear</span><span class="br0">(</span><span class="br0">)</span></span></span> 。若内存分配失败,则任何不标记为 <code>noexcept</code> 的重载可能抛出 <span class="t-lc"><a href="cpp-memory-new-bad_alloc.html">std::bad_alloc</a></span> 。</div>
|
|
<div class="t-li1"><span class="t-li">2)</span> 不接受 <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-error-error_code.html"><span class="kw877">std::<span class="me2">error_code</span></span></a><span class="sy3">&</span></span></span> 参数的重载在底层 OS API 错误时抛出 <a href="cpp-filesystem-filesystem_error.html"><tt>filesystem_error</tt></a> ,以第一 path 参数 <code>p</code>,第二 path 参数 <code>existing_p</code> 和作为错误码参数的 OS 错误码构造。若 OS API 调用失败,则接受 <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-error-error_code.html"><span class="kw877">std::<span class="me2">error_code</span></span></a><span class="sy3">&</span></span></span> 参数的重载设置该参数为 OS API 错误码,而若不出现错误则执行 <span class="t-c"><span class="mw-geshi cpp source-cpp">ec.<span class="me1">clear</span><span class="br0">(</span><span class="br0">)</span></span></span> 。若内存分配失败,则任何不标记为 <code>noexcept</code> 的重载可能抛出 <span class="t-lc"><a href="cpp-memory-new-bad_alloc.html">std::bad_alloc</a></span> 。</div>
|
|
<h3><span class="mw-headline" id=".E6.B3.A8.E8.A7.A3">注解</span></h3>
|
|
<p>保持属性的重载 <span class="t-v">(2)</span> 被 <a href="cpp-filesystem-copy.html"><tt>copy()</tt></a> 在递归地复制目录时隐式调用。其在 boost.filesystem 的等价物是 <a rel="nofollow" class="external text" href="http://www.boost.org/doc/libs/1_57_0/libs/filesystem/doc/reference.html#copy_directory"><code>copy_directory</code></a> (参数顺序相反)</p>
|
|
<h3><span class="mw-headline" id=".E7.A4.BA.E4.BE.8B">示例</span></h3>
|
|
<div class="t-example">
|
|
<div class="t-example-live-link"></div>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="cpp source-cpp">
|
|
<pre class="de1"><span class="co2">#include <iostream></span>
|
|
<span class="co2">#include <fstream></span>
|
|
<span class="co2">#include <cstdlib></span>
|
|
<span class="co2">#include <filesystem></span>
|
|
<span class="kw1">namespace</span> fs <span class="sy1">=</span> std<span class="sy4">::</span><span class="me2">filesystem</span><span class="sy4">;</span>
|
|
|
|
<span class="kw4">int</span> main<span class="br0">(</span><span class="br0">)</span>
|
|
<span class="br0">{</span>
|
|
fs<span class="sy4">::</span><span class="me2">current_path</span><span class="br0">(</span>fs<span class="sy4">::</span><span class="me2">temp_directory_path</span><span class="br0">(</span><span class="br0">)</span><span class="br0">)</span><span class="sy4">;</span>
|
|
fs<span class="sy4">::</span><span class="me2">create_directories</span><span class="br0">(</span><span class="st0">"sandbox/1/2/a"</span><span class="br0">)</span><span class="sy4">;</span>
|
|
fs<span class="sy4">::</span><span class="me2">create_directory</span><span class="br0">(</span><span class="st0">"sandbox/1/2/b"</span><span class="br0">)</span><span class="sy4">;</span>
|
|
fs<span class="sy4">::</span><span class="me2">permissions</span><span class="br0">(</span><span class="st0">"sandbox/1/2/b"</span>, fs<span class="sy4">::</span><span class="me2">perms</span><span class="sy4">::</span><span class="me2">others_all</span>, fs<span class="sy4">::</span><span class="me2">perm_options</span><span class="sy4">::</span><span class="me2">remove</span><span class="br0">)</span><span class="sy4">;</span>
|
|
fs<span class="sy4">::</span><span class="me2">create_directory</span><span class="br0">(</span><span class="st0">"sandbox/1/2/c"</span>, <span class="st0">"sandbox/1/2/b"</span><span class="br0">)</span><span class="sy4">;</span>
|
|
<a href="cpp-utility-program-system.html"><span class="kw974">std::<span class="me2">system</span></span></a><span class="br0">(</span><span class="st0">"ls -l sandbox/1/2"</span><span class="br0">)</span><span class="sy4">;</span>
|
|
<a href="cpp-utility-program-system.html"><span class="kw974">std::<span class="me2">system</span></span></a><span class="br0">(</span><span class="st0">"tree sandbox"</span><span class="br0">)</span><span class="sy4">;</span>
|
|
fs<span class="sy4">::</span><span class="me2">remove_all</span><span class="br0">(</span><span class="st0">"sandbox"</span><span class="br0">)</span><span class="sy4">;</span>
|
|
<span class="br0">}</span></pre></div>
|
|
</div>
|
|
<p>可能的输出:</p>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="text source-text">
|
|
<pre class="de1">drwxr-xr-x 2 user group 4096 Apr 15 09:33 a
|
|
drwxr-x--- 2 user group 4096 Apr 15 09:33 b
|
|
drwxr-x--- 2 user group 4096 Apr 15 09:33 c
|
|
sandbox
|
|
└── 1
|
|
└── 2
|
|
├── a
|
|
├── b
|
|
└── c</pre></div>
|
|
</div>
|
|
</div>
|
|
<h3><span class="mw-headline" id=".E7.BC.BA.E9.99.B7.E6.8A.A5.E5.91.8A">缺陷报告</span></h3>
|
|
<p>下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。</p>
|
|
<table class="dsctable" style="font-size:0.8em">
|
|
<tr>
|
|
<th>DR</th>
|
|
<th>应用于</th>
|
|
<th>出版时的行为</th>
|
|
<th>正确行为</th>
|
|
</tr>
|
|
<tr>
|
|
<td><a rel="nofollow" class="external text" href="https://cplusplus.github.io/LWG/issue2935">LWG 2935</a></td>
|
|
<td>C++17</td>
|
|
<td>若目标已存在但非目录,则为错误</td>
|
|
<td>不再是错误</td>
|
|
</tr>
|
|
<tr>
|
|
<td><a rel="nofollow" class="external text" href="https://cplusplus.github.io/LWG/issue3014">LWG 3014</a></td>
|
|
<td>C++17</td>
|
|
<td><code>create_directories</code> 的 <code>error_code</code> 重载被标记为 noexcept 但能分配内存</td>
|
|
<td>移除 noexcept</td>
|
|
</tr>
|
|
<tr>
|
|
<td><a rel="nofollow" class="external text" href="https://wg21.link/P1164R1">P1164R1</a></td>
|
|
<td>C++17</td>
|
|
<td>已存在的非目录文件导致的创建失败不是错误</td>
|
|
<td>使之为错误</td>
|
|
</tr>
|
|
</table>
|
|
<h3><span class="mw-headline" id=".E5.8F.82.E9.98.85">参阅</span></h3>
|
|
<table class="t-dsc-begin">
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-filesystem-create_symlink.html"><span class="t-lines"><span>create_symlink</span><span>create_directory_symlink</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx17">(C++17)</span></span><span><span class="t-mark-rev t-since-cxx17">(C++17)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>创建一个符号链接<br />
|
|
<span class="t-mark">(函数)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-filesystem-copy.html"><span class="t-lines"><span>copy</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx17">(C++17)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>复制文件或目录<br />
|
|
<span class="t-mark">(函数)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-filesystem-perms.html"><span class="t-lines"><span>perms</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx17">(C++17)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>标识文件系统权限<br />
|
|
<span class="t-mark">(枚举)</span></td>
|
|
</tr>
|
|
</table>
|
|
</div>
|
|
<div class="visualClear"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</html>
|