linuxc 高级编程之文件操作6

本文介绍了一个使用C语言编写的程序,该程序能够递归遍历指定目录(如/home),并打印出所有文件和子目录的名称及其节点号。通过对每个文件或目录进行类型检查,实现对子目录的深入递归。
题目要求:
编写程序完成以下功能:
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++;
 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--;
}
int main()
{
 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  结构体
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字符 */  
}  



//1.创建文件file1,写入字符串“abcdefghijklmn”; //2.创建文件file2,写入字符串“ABCDEFGHIJKLMN”; //3.读取file1中的内容,写入file2,使file2中的字符串内容为“abcdefghijklmn ABCDEFGHIJKLMN” 创建新文件,该文件具有用户读写权限。 //2.采用dup/dup2/fcntl复制一个新的文件描述符,通过新文件描述符向文件写入“class_name”字符串; //3.通过原有的文件描述符读取文件中的内容,并且打印显示; 1.输入文件名称,能够判断文件类型,判断实际用户对该文件具有哪些存取权限; ?2.要求打印出文件类型信息,inode节点编号,链接数目,用户id,组id,文件大小信息; ?3.修改文件的权限为当前用户读写,组内用户读写,组外用户无权限 新建文件,设置文件权限屏蔽字为0; 2.建立该文件的硬链接文件,打印硬链接文件的inode节点号和文件大小; ? 3.建立该文件的软链接文件,打印软链接文件的inode节点号和文件大小;打印软链接文件中的内容; 4.打印源文件的inode节点号,文件大小和链接数目; ? 5.调用unlink对源文件进行操作,打印源文件链接数目; .新建/home/user目录; 2.把当前工作路径移至/home/user目录; 3.打印当前工作路径; ?编写程序完成以下功能: ?1.递归遍历/home目录,打印出所有文件和子目录名称及节点号。 ?2.判断文件类型,如果是子目录,继续进行递归遍历,直到遍历完所有子目录为止
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

啊飞飞飞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值