小米梨 發表於 2024-2-4 00:00:00

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 &amp; 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 &lt;</code><code class="xhtml keyword">unistd.h</code><code class="xhtml plain">&gt;</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]
查看完整版本: linux下判断文件和目录是否存在的方法(总结)