目录
一、目录的基本操作函数
1. 打开目录
#include <sys/types.h>
#include <dirent.h>
DIR *opendir(const char *name);
name:目录的地址
成功返回一个指向目录流的指针,失败返回error;
2. 读目录
#include <dirent.h>
struct dirent *readdir(DIR *dirp);
读取 dirp 目录流所对应的目录,返回是dirent类型的指针,因为该指针一次只能返回一个文件或目录的信息,所以要循环调用readder函数,一直到返回值为NULL(不出错),才算是把该目录下的文件全部读完。
struct dirent {
ino_t d_ino; /* Inode number 索引节点号 */
off_t d_off; /* Not an offset; see below 在目录文件中的偏移 */
unsigned short d_reclen; /* Length of this record 文件名长 */
unsigned char d_type; /* Type of file; not supported
by all filesystem types 文件类型 */
char d_name[256]; /* Null-terminated filename 文件名,最长255字符 */
};
3. 关闭目录流
#include <sys/types.h>
#include <dirent.h>
int closedir(DIR *dirp);
4. 解析目录
golb函数和readdir函数有着类似的功能。
#include <glob.h>
int glob(const char *pattern, int flags,
int (*errfunc) (const char *epath, int eerrno),
glob_t *pglob);
void globfree(glob_t *pglob);
1、pattern:路径名(路径要加“”,不识别~,访问当前路径下的所有文件要加 /*)
2、flags:匹配模式,如是否排序,或者在函数第二次调用时,是否将匹配的内容追加到pglob中,
不进行特殊模式匹配则写0
3、查看错误信息用,一般为NULL
4、pglob:存放匹配到的结果
默认不解析隐藏文件---》如果需要,可以使用追加模式,路径写 xxx/.*
成功返回0,失败返回非0;
globfree函数与golb函数是一对函数,有打开就有关闭。
typedef struct {
size_t gl_pathc; /* Count of paths matched so far 匹配到的数量*/
char **gl_pathv; /* List of matched pathnames. 匹配到的元素*/
size_t gl_offs; /* Slots to reserve in gl_pathv. */
} glob_t;
5. 解析命令行选项
#include <unistd.h>
int getopt(int argc, char * const argv[], const char *optstring);
getopt()用来分析终端输入的命令行参数
argc和argv分别代表参数个数和内容,跟main()函数的命令行参数是一样的。
参数 optstring为选项字符串, 声明 getopt()可以处理哪个选项以及哪个选项需要参数
具体的optstring选型类型可以参照 getopt()用法详解
二、练习
#include <stdio.h>
#include <errno.h>
#include <dirent.h>
int main(int argc, char *argv[])
{
DIR *dp;
struct dirent *entry;
if (argc < 2)
return 1;
dp = opendir(argv[1]);
if (NULL == dp) {
perror("opendir()");
return 1;
}
// 读目录
while (1) {
entry = readdir(dp);
if (NULL == entry) {
if (errno) {
perror("readdir()");
goto ERROR;
}
break;
}
printf("%s\n", entry->d_name);
}
closedir(dp);
return 0;
ERROR:
closedir(dp);
return 1;
}
#include <stdio.h>
#include <string.h>
#include <glob.h>
/*
测试使用glob解析目录
*/
#define BUFSIZE 128
int main(int argc, char *argv[])
{
glob_t res;
char buf[BUFSIZE] = {};
char *p;
if (argc < 2)
return 0;
// argv[1]--->./*
glob(argv[1], 0, NULL, &res);
// 解析argv[1]路径下的隐藏文件
strcpy(buf, argv[1]);
p = strrchr(buf, '/');
if (NULL == p)
return 1;
strcpy(p+1, ".*"); //"./.*"
glob(buf, GLOB_APPEND, NULL, &res);
for (int i = 0; i < res.gl_pathc; i++)
puts((res.gl_pathv)[i]);
globfree(&res);
return 0;
}
#include <stdio.h>
#include <unistd.h>
/*
解析命令行选项
./a.out
-h:hello
-a:all stand up
-w:world
*/
int main(int argc, char *argv[])
{
int c;
while (1) {
c = getopt(argc, argv, "-h:aw");
if (c == -1)
break;
switch (c) {
case 'h':
printf("hello\n");
printf("-h的参数为:%s\n", optarg);
break;
case 'w':
printf("world\n");
break;
case 'a':
printf("all stand up\n");
break;
case '?':
printf("i don't know\n");
break;
case 1:
// 非选项参数:要求optstring首字符'-'
printf("得到了非选项参数:%s\n", argv[optind-1]);
break;
default:
break;
}
}
return 0;
}