c++怎么判断路径是文件还是文件夹_is_regular_file与is_directory【实战】

冬枫同学_3607

冬枫同学_3607

2026-04-06

680人浏览

原创

应先调用 std::filesystem::exists(p) 确认路径存在,再用 is_regular_file() 或 is_directory() 判断类型;否则不存在路径时二者均返回 false,易导致逻辑错误。

c++怎么判断路径是文件还是文件夹_is_regular_file与is_directory【实战】

std::filesystem::is_regular_file()std::filesystem::is_directory() 前先确认路径存在

这两个函数不会自动检查路径是否存在,如果传入一个根本不存在的路径(比如 "./nonexistent.txt"),它们会返回 false —— 但这个 false 不代表“是文件夹”或“不是普通文件”,而是“无法判断”,因为底层操作失败了。实际开发中容易误以为 !is_regular_file(p) 就等于 is_directory(p),这是错的。

正确做法是先调用 std::filesystem::exists(p)

namespace fs = std::filesystem;
fs::path p = "./test";
if (!fs::exists(p)) {
    std::cout <h3>
<code>is_regular_file()</code> 不识别符号链接指向的目标</h3><p>默认情况下,<code>is_regular_file()</code> 对符号链接返回 <code>false</code>(除非链接本身被解析)。它只判断路径**自身**的类型,不跟随链接。如果你需要“这个路径最终指向一个普通文件”,得显式使用 <code>fs::status(p).type() == fs::file_type::regular</code> 或更稳妥地用 <code>fs::symlink_status(p)</code> 对比:</p>
  • fs::status(p):跟随符号链接,获取目标文件的属性
  • fs::symlink_status(p):不跟随,只看链接本身的元数据

所以判断“是否为普通文件(含链接指向的)”应写成:

try {
    auto s = fs::status(p); // 可能抛出 filesystem_error
    if (s.type() == fs::file_type::regular) { /* ... */ }
} catch (const fs::filesystem_error&) {
    // 路径不可访问,如权限不足或跨挂载点失效链接
}

Windows 下注意长路径和 Unicode 路径编码

在 Windows 上,如果路径含中文或超过 260 字符,仅靠 std::filesystem 默认行为可能失败(尤其在旧版 MSVC 或未启用 UTF-8 模式时)。确保:

C++ 算法竞赛自动化测试数据生成与校验框架
C++ 算法竞赛自动化测试数据生成与校验框架

根据原题生成新题面、验证器及完整测试数据,自动套用 testlib 模板,用于用户要求生成测试数据时。

下载
  • 编译时加 /utf-8(MSVC)或 -finput-charset=UTF-8(GCC/Clang)
  • 运行前调用 SetConsoleOutputCP(CP_UTF8)(若需控制台输出)
  • 避免用 char* 构造 fs::path,优先用 std::wstring 或 UTF-8 编码的 std::string(C++17 起支持)

错误示例:fs::path p("C:\用户\test"); 在非 UTF-8 控制台下可能变成乱码路径;正确写法是:fs::path p(L"C:\用户\test"); 或确保源文件保存为 UTF-8 with BOM 并启用编译器 UTF-8 支持。

性能敏感场景慎用多次 status() 调用

每个 is_regular_file()is_directory()exists() 都可能触发一次系统调用。频繁判断同一路径时,建议一次性获取状态再分支处理:

try {
    auto s = fs::status(p);
    bool exists = (s.type() != fs::file_type::not_found);
    bool is_file = (s.type() == fs::file_type::regular);
    bool is_dir  = (s.type() == fs::file_type::directory);
    // 后续逻辑复用这三个 bool
} catch (...) { /* 处理异常 */ }

这比连续写 exists(p) + is_regular_file(p) + is_directory(p) 少 2 次系统调用,在循环或高频路径判断中差异明显。

真正容易被忽略的是:这些函数对软链接、挂载点、网络路径(如 SMB)的行为不一致,且异常类型(filesystem_error)的 code().value() 才是真实 errno,直接打印 what() 很难定位权限或跨设备问题。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.02

5019

3

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.26

2979

3

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.07.27

2538

6

windows照片无法显示
windows照片无法显示

当我们尝试打开一张图片时,可能会出现一个错误提示,提示说"Windows照片查看器无法显示此图片,因为计算机上的可用内存不足",本专题为大家提供windows照片无法显示相关的文章,帮助大家解决该问题。

2023.08.01

1408

3

windows查看端口被占用的情况
windows查看端口被占用的情况

windows查看端口被占用的情况的方法:1、使用Windows自带的资源监视器;2、使用命令提示符查看端口信息;3、使用任务管理器查看占用端口的进程。本专题为大家提供windows查看端口被占用的情况的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

2319

5

windows无法访问共享电脑
windows无法访问共享电脑

在现代社会中,共享电脑是办公室和家庭的重要组成部分。然而,有时我们可能会遇到Windows无法访问共享电脑的问题。这个问题可能会导致数据无法共享,影响工作和生活的正常进行。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.08

3190

4

windows自动更新
windows自动更新

Windows操作系统的自动更新功能可以确保系统及时获取最新的补丁和安全更新,以提高系统的稳定性和安全性。然而,有时候我们可能希望暂时或永久地关闭Windows的自动更新功能。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

1457

3

windows boot manager
windows boot manager

windows boot manager无法开机的解决方法:1、系统文件损坏,使用Windows安装光盘或USB启动盘进入恢复环境,选择修复计算机,然后选择自动修复;2、引导顺序错误,进入恢复环境,选择命令提示符,输入命令"bootrec /fixboot"和"bootrec /fixmbr",然后重新启动计算机;3、硬件问题,使用硬盘检测工具进行扫描和修复;4、重装操作系统。本专题还提供其他解决

2023.08.28

2377

4

windows锁屏快捷键
windows锁屏快捷键

windows锁屏快捷键是Windows键+L、Ctrl+Alt+Del、Windows键+D、Windows键+P和Windows键+R。本专题为大家提供windows相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.30

4127

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Valgrind Quick Start Guide
Valgrind Quick Start Guide

共0课时 | 0人学习

CLion CMake 快速入门教程
CLion CMake 快速入门教程

共0课时 | 0人学习