#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
int main (void)
{
DIR *dp;
struct dirent *ep;
dp = opendir ("./");
if (dp != NULL)
{
while (ep = readdir (dp))
puts (ep->d_name);
(void) closedir (dp);
}
else
perror ("Couldn't open the directory");
return 0;
}
此代码为我提供了该目录中的所有内容。它像“ls”命令一样工作。例如,假设我有一个文件夹,名称是“文件夹”,一个.txt文件,名称是“输入”(名称可能是不同的btw),在该目录中。我想决定它是文件夹还是txt文件。如果是txt文件我该怎么读呢?
答案 0 :(得分:1)
]您可以使用scandir()
功能打开并扫描目录中的条目。
该示例来自man 3 scandir
#define _SVID_SOURCE
/* print files in current directory in reverse order */
#include <dirent.h>
int
main(void)
{
struct dirent **namelist;
int n;
n = scandir(".", &namelist, NULL, alphasort);
if (n < 0)
perror("scandir");
else {
while (n--) {
printf("%s\n", namelist[n]->d_name);
free(namelist[n]);
}
free(namelist);
}
}
请注意struct dirent
:
struct dirent {
ino_t d_ino; /* inode number */
off_t d_off; /* offset to the next dirent */
unsigned short d_reclen; /* length of this record */
unsigned char d_type; /* type of file; not supported
by all file system types */
char d_name[256]; /* filename */
};
您可以d_type
字段检查当前条目是常规文件,目录还是其他文件。
可用的文件类型是:
#define DT_UNKNOWN 0
#define DT_FIFO 1
#define DT_CHR 2
#define DT_DIR 4 // directory type
#define DT_BLK 6
#define DT_REG 8 // regular file, txt file is a regular file
#define DT_LNK 10
#define DT_SOCK 12
#define DT_WHT 14
检查文件的名称和类型后,您可以使用open()
(系统调用)或fopen()
(glib函数)安全地打开它,并按read()
读取内容(如果您通过open()或fread()
(fopen()对应方式)打开文件。
阅读后不要忘记关闭文件。
此外,如果您只是想检查目录的存在性和可访问性,那么access()
就可以处理了。
下面的代码测试目录是否存在。
int exist_dir (const char *dir)
{
DIR *dirptr;
if (access(dir, F_OK) != -1) {
// file exists
if ((dirptr = opendir(dir)) != NULL) {
// do something here
closedir (dirptr);
} else {
// dir exists, but not a directory
return -1;
}
} else {
// dir does not exist
return -1;
}
return 0;
}
答案 1 :(得分:1)
可以通过调用函数stat
获取有关除内容之外的文件的所有信息。 stat
有签名
int stat(const char *pathname, struct stat *buf);
并返回buf
指向的缓冲区中的文件信息。
struct stat
在字段st_mode
中对文件类型和文件权限的信息进行编码。
定义了一些额外的宏来测试文件类型:
S_ISREG(m)是常规文件吗?
S_ISDIR(m)目录?
S_ISCHR(m)字符设备?
S_ISBLK(m)块设备?
S_ISFIFO(m)FIFO(命名管道)?
S_ISLNK(m)符号链接? (不在POSIX.1-1996中。)
S_ISSOCK(m)套接字? (不在POSIX.1-1996中。)
以下是一段示例代码:
stat(pathname, &sb);
if (S_ISREG(sb.st_mode)) {
/* Handle regular file */
}
至于阅读,使用函数sprintf
连接目录路径和文件名以获取文件路径,如下所示:
sprintf(file_path, "%s/%s", dir_path, file_name);