题目要求:
编写程序完成以下功能:
1.递归遍历/home目录,打印出所有文件和子目录名称及节点号。
2.判断文件类型,如果是子目录,继续进行递归遍历,直到遍历完所有子目录为止
源代码:
编写程序完成以下功能:
1.递归遍历/home目录,打印出所有文件和子目录名称及节点号。
2.判断文件类型,如果是子目录,继续进行递归遍历,直到遍历完所有子目录为止
源代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <dirent.h>
#include <unistd.h>
static int n=-1;
void show()
{
int i;
for (i=0;i<n;i++)
{
printf("---");
}
}
void print(char *path)
{
n++;
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <dirent.h>
#include <unistd.h>
static int n=-1;
void show()
{
int i;
for (i=0;i<n;i++)
{
printf("---");
}
}
void print(char *path)
{
n++;
char p[512];
struct stat statbuf;
DIR *dir;
struct dirent *dirp;
if(!(dir=opendir(path)))
{
perror("open fail:");
exit(-1);
}
while ((dirp=readdir(dir))!=NULL)
{
if(dirp->d_name[0]=='.')
{
continue;
}
show();
sprintf(p,"%s/%s",path,dirp->d_name);
lstat(p,&statbuf);
if(S_ISDIR(statbuf.st_mode))
{
printf("dir:%s\n",dirp->d_name);
print(p);
}
else
{
printf("file:%s\t%ld\n",dirp->d_name,statbuf.st_ino);
}
}
n--;
}
struct stat statbuf;
DIR *dir;
struct dirent *dirp;
if(!(dir=opendir(path)))
{
perror("open fail:");
exit(-1);
}
while ((dirp=readdir(dir))!=NULL)
{
if(dirp->d_name[0]=='.')
{
continue;
}
show();
sprintf(p,"%s/%s",path,dirp->d_name);
lstat(p,&statbuf);
if(S_ISDIR(statbuf.st_mode))
{
printf("dir:%s\n",dirp->d_name);
print(p);
}
else
{
printf("file:%s\t%ld\n",dirp->d_name,statbuf.st_ino);
}
}
n--;
}
int main()
{
print("/home");
return 0;
}
{
print("/home");
return 0;
}
读取目录信息:
数据结构
DIR, struct dirent
基本操作
opendir()/closedir()
readdir()
telldir()
seekdir()
基本数据结构
DIR
目录流对象
头文件
<dirent.h>
定义形式
typedef struct _dirstream DIR;
struct dirent
目录项
头文件
<dirent.h>
定义
ino_t d_ino; /* inode号*/
char d_name[NAME_MAX + 1]; /* 文件名*/
目录基本操作
功能
打开、关闭、读、定位
头文件
#include <sys/types.h>
#include <dirent.h>
函数原型
DIR *opendir(const char *name);
int closedir(DIR *dir);
struct dirent *readdir(DIR *dir);
off_t telldir(DIR *dir); //获取目录流读取位置
void seekdir(DIR *dir, off_t offset);
struct dirent 结构体
数据结构
DIR, struct dirent
基本操作
opendir()/closedir()
readdir()
telldir()
seekdir()
基本数据结构
DIR
目录流对象
头文件
<dirent.h>
定义形式
typedef struct _dirstream DIR;
struct dirent
目录项
头文件
<dirent.h>
定义
ino_t d_ino; /* inode号*/
char d_name[NAME_MAX + 1]; /* 文件名*/
目录基本操作
功能
打开、关闭、读、定位
头文件
#include <sys/types.h>
#include <dirent.h>
函数原型
DIR *opendir(const char *name);
int closedir(DIR *dir);
struct dirent *readdir(DIR *dir);
off_t telldir(DIR *dir); //获取目录流读取位置
void seekdir(DIR *dir, off_t offset);
struct dirent 结构体
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) 文件名,最长255字符 */
}
{
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) 文件名,最长255字符 */
}