linux下判断文件和目录是否存在的方法(总结)
<p><span><strong>1、前言</strong></span></p>
<p>
工作中涉及到文件系统,有时候需要判断文件和目录是否存在。我结合apue第四章文件和目录,总结一下如何正确判断文件和目录是否存在,方便以后查询。</p>
<p>
<span><strong>2、stat系列函数</strong></span></p>
<p>
stat函数用来返回与文件有关的结构信息。stat系列函数有三种情况,分别对应文件名称、文件描述符和符号链接文件。stat结构描述了文件的属性,主要包括文件的类型、文件大小等等。详细stat结构如下所示:</p>
<div class="jb51code">
<div>
<div class="syntaxhighlighterxhtml" id="highlighter_58157">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
<div class="line number2 index1 alt1">
2</div>
<div class="line number3 index2 alt2">
3</div>
<div class="line number4 index3 alt1">
4</div>
<div class="line number5 index4 alt2">
5</div>
<div class="line number6 index5 alt1">
6</div>
<div class="line number7 index6 alt2">
7</div>
<div class="line number8 index7 alt1">
8</div>
<div class="line number9 index8 alt2">
9</div>
<div class="line number10 index9 alt1">
10</div>
<div class="line number11 index10 alt2">
11</div>
<div class="line number12 index11 alt1">
12</div>
<div class="line number13 index12 alt2">
13</div>
<div class="line number14 index13 alt1">
14</div>
<div class="line number15 index14 alt2">
15</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="xhtml plain">struct stat {</code>
</div>
<div class="line number2 index1 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">mode_t st_mode; // file type & mode(permissions)</code>
</div>
<div class="line number3 index2 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">ino_t st_ino; // i-node number(serial number)</code>
</div>
<div class="line number4 index3 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">dev_t st_dev; // device number(filesystem)</code>
</div>
<div class="line number5 index4 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">dev_t st_rdev; // device number for specials files</code>
</div>
<div class="line number6 index5 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">nlink_t st_nlink; // number of links</code>
</div>
<div class="line number7 index6 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">uid_t st_uid; // user id of owner</code>
</div>
<div class="line number8 index7 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">gid_t st_gid; // group id of owner</code>
</div>
<div class="line number9 index8 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">off_t st_size; // size in bytes, for regular files</code>
</div>
<div class="line number10 index9 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">time_t st_atime; // time of last access</code>
</div>
<div class="line number11 index10 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">time_t st_mtime; // time of last modification</code>
</div>
<div class="line number12 index11 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">time_t st_ctime; // time of last file status change</code>
</div>
<div class="line number13 index12 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">long st_blksize; // best i/o block size</code>
</div>
<div class="line number14 index13 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">long st_blocks; // number of 512-byte blocks allocated</code>
</div>
<div class="line number15 index14 alt2">
<code class="xhtml plain">};</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
</div>
<p>
我们可以通过stat获取文件的类型和文件大小等信息。文件类型有:普通文件、目录文件、块特殊文件、字符特殊文件、fifo、套接字和符号链接。要想通过stat系列函数来判断文件或者目录是否存在,当执行stat函数,如果文件存在时,还需进一步判断该文件是普通文件还是目录文件。</p>
<p>
<span><strong>stat系列函数错误返回-1,错误码存在errno中,errno取值如下:</strong></span></p>
<div class="jb51code">
<div>
<div class="syntaxhighlighterxhtml" id="highlighter_291116">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
<div class="line number2 index1 alt1">
2</div>
<div class="line number3 index2 alt2">
3</div>
<div class="line number4 index3 alt1">
4</div>
<div class="line number5 index4 alt2">
5</div>
<div class="line number6 index5 alt1">
6</div>
<div class="line number7 index6 alt2">
7</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="xhtml plain">1、enoent 参数file_name 指定的文件不存在</code>
</div>
<div class="line number2 index1 alt1">
<code class="xhtml plain">2、enotdir 路径中的目录存在但却非真正的目录</code>
</div>
<div class="line number3 index2 alt2">
<code class="xhtml plain">3、eloop 欲打开的文件有过多符号连接问题, 上限为16 符号连接</code>
</div>
<div class="line number4 index3 alt1">
<code class="xhtml plain">4、efault 参数buf 为无效指针, 指向无法存在的内存空间</code>
</div>
<div class="line number5 index4 alt2">
<code class="xhtml plain">5、eaccess 存取文件时被拒绝</code>
</div>
<div class="line number6 index5 alt1">
<code class="xhtml plain">6、enomem 核心内存不足</code>
</div>
<div class="line number7 index6 alt2">
<code class="xhtml plain">7、enametoolong 参数file_name 的路径名称太长</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
</div>
<p>
<span><span><strong>3、access函数</strong></span></span></p>
<p>
access函数按照实际用户id和实际组进行访问权限测试。函数原型为:</p>
<div class="jb51code">
<div>
<div class="syntaxhighlighterxhtml" id="highlighter_250500">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
<div class="line number2 index1 alt1">
2</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="xhtml plain">#include <</code><code class="xhtml keyword">unistd.h</code><code class="xhtml plain">></code>
</div>
<div class="line number2 index1 alt1">
<code class="xhtml plain">int access(const char *pathname, int mode);</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
</div>
<p>
</p>
<p>
<span><strong>mode取值:</strong></span></p>
<p>
f_ok 测试文件是否存在</p>
<p>
r_ok 测试读权限</p>
<p>
w_ok 测试写权限</p>
<p>
x_ok 测试执行权限</p>
<p>
正确判断一个文件是否存在是用access函数,实现如下所示:</p>
<p>
<img title="linux下判断文件和目录是否存在的方法(总结)" alt="linux下判断文件和目录是否存在的方法(总结)" src="https://zhuji.jb51.net/uploads/img/202305/09683a7d15f9f2f9d42e798b4f0ade1e.jpg"></p>
<p>
<span><strong>4、oepndir函数</strong></span></p>
<p>
opendir函数用来打开文件目录,成功返回指针,出错返回null。实现如下:</p>
<p>
<img title="linux下判断文件和目录是否存在的方法(总结)" alt="linux下判断文件和目录是否存在的方法(总结)" src="https://zhuji.jb51.net/uploads/img/202305/367501e67713916615e399d58c116013.jpg"></p>
<p>
以上这篇linux下判断文件和目录是否存在的方法(总结)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。</p>
頁:
[1]