关于目录的基本函数

目录

一、目录的基本操作函数

        1. 打开目录

        2. 读目录

        3. 关闭目录流    

         4. 解析目录

        5. 解析命令行选项

二、练习


一、目录的基本操作函数

        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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值