目录操作 递归打印目录 DIR drent

目录操作

1.查找当前目录下,所有文件,文件内容有string,打印出文件名

/*打印当前目录的文件名*/

/*
./a.out string
查找当前目录下,所有文件,文件内容有string,打印出文件名
*/

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <dirent.h>

#define N 1024

int main(int argc, char **argv)
{
	DIR *dp;
	struct dirent *item;
	FILE *fp;
	char buf[1024];

	if(argc != 2){
		printf("Use:./a.out string\n");
	}

	dp = opendir(".");
	if(dp == NULL){
		perror("open dir file\n");
	}

	while( (item = readdir(dp)) ){
//		if( strstr(item->d_name, argv[1]) != NULL){
//			printf("%s\n", item->d_name);
			fp = fopen(item->d_name, "r");
			while( fgets(buf, N, fp) != NULL){ //fgets读取包括\n   (abchello\n\0)
				
				if( strstr(buf, argv[1]) != NULL){
					buf[strlen(buf) - 1] = '\0';		
					printf("%s\n%s\n", item->d_name, buf);
				}				
			}
	}

	closedir(dp);
	return 0;
}

/*
akaedu@akaedu:~/ms/read_open_dir$ ./dir stdio.h
read_to_file_open.c
#include <stdio.h>
dir.c
#include <stdio.h>
read_to_file.c
#include <stdio.h>
akaedu@akaedu:~/ms/read_open_dir$
*/




2.递归打印目录


----------------------------------------------------------------------------------------
struct dirent
{
	long d_ino;					/* inode number 索引节点号 */
	off_t d_off;				/* offset to this dirent 在目录文件中的偏移 */
	unsigned short d_reclen;    /* length of this d_name 文件名长 */
	unsigned char d_type;		/* the type of d_name 文件类型 */
	char d_name [NAME_MAX+1];   /* file name (null-terminated) 文件名,最长256字符 */
}

struct dirent中的几个成员:
	d_type:4表示为目录,8表示为文件
	d_reclen:16表示子目录或文件,24表示非子目录
	经过本人亲自试验发现:d_reclen:16表示子目录或以.开头的隐藏文件,24表示普通文本文件,28为二进制文件,等等
	d_name:目录或文件的名称

----------------------------------------------------------------------------------------



/*
	功能:演示了在Linux下利用C语言递归遍历指定目录下的子目录(不含隐藏目录)和文件
*/
#include <stdio.h>
#include <dirent.h>   //for opendir(),readdir(),closedir()
#include <string.h>



void print_dir(char * dir_path)
{
    DIR *pdir; //打开目录的句柄,类似于 FILE *fp
    struct dirent *dp = NULL;
    
    if( ( pdir = opendir(dir_path) )  != NULL )  //打开路径(目录),返回一目录句柄
    {
        while(  (dp = readdir(pdir))  != NULL )  //读目录信息,返回值为一个struct dirent的结构体
        {
            if( dp->d_type == 8 )                // d_type:8-文件,4-目录
            {
                printf("File:\t%s\n", dp->d_name); //打印文件名称 
            }
            else if( (dp->d_type == 4) && (dp->d_name[0] != '.') )        //是目录的情况下,打印出除 '.'目录 '.' 表示当前目录自身,外的目录
            {
                printf("\n[Dir]: %s\n", dp->name);
                print_dir(dp->name);              //递归遍历子目录
                printf("返回[%s]\n", dp->name);
            }
        }
        closedir(pdir);
    }
    else
    {
        printf("Open Dir-[%s] failed.\n", dir_path);
    }
    
}


int main(int argc, char *argv[])
{
  
 /*   
    if( argc != 2 )
    {
        printf("Use:./a.out path\n");
    }
 */ 
 
    char char path[] = "/home/zcm/program/test";
    print_dir(path);
    
    return 0;
}




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值