我无法在网上找到解决我的问题的方法。
我想在Unix中调用一个函数,传入一个目录路径,并知道它是否存在。 opendir()
如果目录不存在会返回错误,但是我的目标并不是实际打开目录、检查错误、如果没有错误则关闭它,而只是检查文件是否为目录。
请问有没有什么方便的方式来做到这一点?
我无法在网上找到解决我的问题的方法。
我想在Unix中调用一个函数,传入一个目录路径,并知道它是否存在。 opendir()
如果目录不存在会返回错误,但是我的目标并不是实际打开目录、检查错误、如果没有错误则关闭它,而只是检查文件是否为目录。
请问有没有什么方便的方式来做到这一点?
在POSIX系统中有两个相关函数:stat()和lstat()。它们用于确定路径名是否指向您有权访问的实际对象,如果是,则返回的数据告诉您它是什么类型的对象。 stat()
和lstat()
之间的区别在于,如果给定的名称是符号链接,则stat()
会跟随符号链接(或链接链,如果它们被链接在一起),并报告链接链末端的对象,而lstat()
报告符号链接本身。
#include <sys/stat.h>
struct stat sb;
if (stat(pathname, &sb) == 0 && S_ISDIR(sb.st_mode))
{
...it is a directory...
}
如果函数表明操作成功,你可以使用<sys/stat.h>
中的S_ISDIR()宏来判断该文件是否是目录。你也可以使用其他的S_IS*
宏检查其他文件类型:
S_ISDIR
— 目录S_ISREG
— 普通文件S_ISCHR
— 字符设备S_ISBLK
— 块设备S_ISFIFO
— FIFO(命名管道)S_ISLNK
— 符号链接S_ISSOCK
— 套接字stat
函数期望 pathname 参数为 char 类型? - IgorGanapolskychar
,而是char *
——字符串。函数的POSIX规范链接表明stat()
和lstat()
的第一个参数为const char * restrict pathname
。 - Jonathan LefflerS_IS*
宏的更多信息:https://www.gnu.org/software/libc/manual/html_node/Testing-File-Type.html#Testing-File-Type - m4l490n<sys/stat.h>
规范,如答案中所链接。其中有这样的定义:*S_ISBLK(m)
— 测试是否为块特殊文件。* - Jonathan Leffler。
int check(unsigned const char type) {
if(type == DT_REG)
return 1;
if(type == DT_DIR)
return 0;
return -1;
}
如果您不太关心文件系统对象的类型,可以使用access(name,F_OK)检查是否存在具有此名称的内容。 如果您需要确保这是目录,请使用stat()并使用S_ISDIR()宏检查类型。
F_OK
,如果传递给 access()
的名称具有多个路径组件并且当前进程(EUID)没有权限搜索其中一个前导目录组件,则可能会遇到 EACCES
(因此它可以检查简单文件名的存在性,但可能会在非简单文件名上遇到问题)。 - Jonathan LefflerC++17
使用std::filesystem::is_directory
:
#include <filesystem>
void myFunc(const std::filesystem::path& directoryPath_c)
{
if (std::filesystem::is_directory(directoryPath_c)) {
//if (std::filesystem::exists(directoryPath_c)) { // An alternative*
// do something.
}
}
或者在它的noexcept
版本中:
#include <filesystem>
void myFunc(const std::filesystem::path& directoryPath_c)
{
std::error_code ec{};
if (std::filesystem::is_directory(directoryPath_c, ec)) {
//if (std::filesystem::exists(directoryPath_c, ec)) { // An alternative*
// do something.
}
}
directoryPath_c
存在但是是一个常规文件,std::filesystem::exists(directoryPath_c)
会返回true
,尽管该文件夹不存在。