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

时间:2022-05-19 22:11:49

目录操作

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