在POSIX系统上有两个相关的函数:stat() and 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...
}
您可以通过将目录名称作为第一个参数传递给stat系统调用来使用它。如果目录存在,则返回0,否则返回-1,并且errno将被设置为ENOENT。 编辑: 如果返回值为0,则需要额外检查以确保参数实际上是一个目录,而不是文件/symlink/char special file/blk special file/FIFO文件。您可以使用stat structure的st_mode字段。
5条答案
按热度按时间ajsxfq5m1#
在POSIX系统上有两个相关的函数:stat() and lstat()。这些用于确定路径名是否引用了您有权限访问的实际对象,如果是,则返回的数据告诉您它是什么类型的对象。
stat()
和lstat()
之间的区别在于,如果您给予的名称是符号链接,stat()
跟随符号链接(或链接,如果它们链接在一起)并报告链接链末端的对象,而lstat()
报告符号链接本身。如果函数指示成功,则使用
<sys/stat.h>
中的S_ISDIR()宏来确定文件是否实际上是一个目录。您还可以使用其他
S_IS*
宏检查其他文件类型:S_ISDIR
-目录S_ISREG
-常规文件S_ISCHR
-字符设备S_ISBLK
-块设备S_ISFIFO
- FIFOS_ISLNK
-符号链接S_ISSOCK
-插座(Some系统也提供一些其他文件类型;例如,
S_ISDOOR
在Solaris上可用。)k3fezbri2#
您可以通过将目录名称作为第一个参数传递给
stat
系统调用来使用它。如果目录存在,则返回0
,否则返回-1
,并且errno将被设置为ENOENT
。编辑:
如果返回值为
0
,则需要额外检查以确保参数实际上是一个目录,而不是文件/symlink/char special file/blk special file/FIFO文件。您可以使用stat structure
的st_mode
字段。rseugnpd3#
如果你不关心这个文件系统对象的类型,access(name,F_OK)会检查这个文件系统对象是否存在。如果你需要确定这个文件系统对象是目录,使用stat()并使用S_ISDIR()宏检查类型。
tmb3ates4#
另一个简单的方法是:
然后你可以将 *struct dirent**对象的d_type传递给 check 函数。
如果check返回1,则该路径指向常规文件。
如果check返回0,则该路径指向目录。
否则,它既不是文件也不是目录(它可以是块设备/符号链接等)。
bakd9h0s5#
C++17语言
使用
std::filesystem::is_directory
:在
noexept
版本中:directoryPath_c
作为常规文件存在,std::filesystem::exists(directoryPath_c)
将返回true
,尽管该文件夹不存在。