当前位置: 首页> 最新文章列表> 如何通过 lstat 函数读取文件的权限、大小和时间戳等属性?

如何通过 lstat 函数读取文件的权限、大小和时间戳等属性?

gitbox 2025-09-09
<span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-comment">// 这里的代码和文章无关,只是占位符</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"文章即将开始..."</span></span><span>;

</span><span><span class="hljs-meta">?&gt;</span></span><span>

&lt;hr&gt;

</span><span><span class="hljs-comment"># 如何通过 lstat 函数读取文件的权限、大小和时间戳等属性?</span></span><span>

在日常的 PHP 开发中,我们经常需要获取文件的相关信息,例如:文件权限、文件大小、最后访问时间、最后修改时间等。PHP 提供了一个功能非常强大的函数 —— **</span><span><span class="hljs-title function_ invoke__">lstat</span></span><span>()**,它可以帮助我们快速获取这些属性。

</span><span><span class="hljs-comment">## lstat() 函数简介</span></span><span>

`</span><span><span class="hljs-title function_ invoke__">lstat</span></span><span>()` 与 `</span><span><span class="hljs-title function_ invoke__">stat</span></span><span>()` 类似,都用于获取文件信息,不同之处在于:  
- **</span><span><span class="hljs-title function_ invoke__">stat</span></span><span>()**:会跟随符号链接,返回目标文件的信息。  
- **</span><span><span class="hljs-title function_ invoke__">lstat</span></span><span>()**:不会跟随符号链接,而是返回符号链接本身的信息。  

这在处理软链接时尤为重要。

函数原型如下:

```php
</span><span><span class="hljs-keyword">array</span></span><span> </span><span><span class="hljs-title function_ invoke__">lstat</span></span><span>(</span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$filename</span></span><span>)
</span></span>
  • $filename:需要获取信息的文件路径。

  • 返回值:一个包含文件信息的数组,如果失败则返回 false

返回结果说明

lstat() 返回的数组中包含多个下标和键名,对应文件的不同属性。常见的有:

  • dev:设备号

  • ino:inode 节点号

  • mode:文件类型与权限(需要通过 decoct() 或位运算来解读)

  • nlink:硬链接数量

  • uid:用户 ID

  • gid:组 ID

  • size:文件大小(字节)

  • atime:最后访问时间(UNIX 时间戳)

  • mtime:最后修改时间(UNIX 时间戳)

  • ctime:inode 修改时间(UNIX 时间戳)

示例代码

下面的示例演示了如何读取某个文件的权限、大小和时间戳等属性:

<span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-variable">$filename</span></span><span> = </span><span><span class="hljs-string">"example.txt"</span></span><span>;

</span><span><span class="hljs-comment">// 获取文件属性</span></span><span>
</span><span><span class="hljs-variable">$fileInfo</span></span><span> = </span><span><span class="hljs-title function_ invoke__">lstat</span></span><span>(</span><span><span class="hljs-variable">$filename</span></span><span>);

</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$fileInfo</span></span><span> !== </span><span><span class="hljs-literal">false</span></span><span>) {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"文件大小: "</span></span><span> . </span><span><span class="hljs-variable">$fileInfo</span></span><span>[</span><span><span class="hljs-string">'size'</span></span><span>] . </span><span><span class="hljs-string">" 字节\n"</span></span><span>;

    </span><span><span class="hljs-comment">// 转换文件权限为八进制表示</span></span><span>
    </span><span><span class="hljs-variable">$permissions</span></span><span> = </span><span><span class="hljs-title function_ invoke__">substr</span></span><span>(</span><span><span class="hljs-title function_ invoke__">sprintf</span></span><span>(</span><span><span class="hljs-string">'%o'</span></span><span>, </span><span><span class="hljs-variable">$fileInfo</span></span><span>[</span><span><span class="hljs-string">'mode'</span></span><span>]), -</span><span><span class="hljs-number">4</span></span><span>);
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"文件权限: "</span></span><span> . </span><span><span class="hljs-variable">$permissions</span></span><span> . </span><span><span class="hljs-string">"\n"</span></span><span>;

    </span><span><span class="hljs-comment">// 输出时间戳信息</span></span><span>
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"最后访问时间: "</span></span><span> . </span><span><span class="hljs-title function_ invoke__">date</span></span><span>(</span><span><span class="hljs-string">"Y-m-d H:i:s"</span></span><span>, </span><span><span class="hljs-variable">$fileInfo</span></span><span>[</span><span><span class="hljs-string">'atime'</span></span><span>]) . </span><span><span class="hljs-string">"\n"</span></span><span>;
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"最后修改时间: "</span></span><span> . </span><span><span class="hljs-title function_ invoke__">date</span></span><span>(</span><span><span class="hljs-string">"Y-m-d H:i:s"</span></span><span>, </span><span><span class="hljs-variable">$fileInfo</span></span><span>[</span><span><span class="hljs-string">'mtime'</span></span><span>]) . </span><span><span class="hljs-string">"\n"</span></span><span>;
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"inode 修改时间: "</span></span><span> . </span><span><span class="hljs-title function_ invoke__">date</span></span><span>(</span><span><span class="hljs-string">"Y-m-d H:i:s"</span></span><span>, </span><span><span class="hljs-variable">$fileInfo</span></span><span>[</span><span><span class="hljs-string">'ctime'</span></span><span>]) . </span><span><span class="hljs-string">"\n"</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"无法获取文件信息。\n"</span></span><span>;
}
</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>

总结

  • 当我们需要获取文件信息时,lstat()stat() 都可以使用。

  • 如果文件路径可能是符号链接,且需要查看的是链接本身的属性,就应使用 lstat()

  • 通过 lstat(),我们可以方便地获取文件权限、大小、时间戳等属性,为文件管理、日志分析等场景提供了极大的便利。

<span></span>