opendir函数
根据传入的目录名打开一个目录(库函数) DIR*类似于FILE*
DIR *opendir(const char *name);
成功返回 指向该目录结构体指针
失败返回NULL
参数支持相对路径、绝对路径两种方式:例如:打开当前目录:①getcwd(),opendir() ②opendir(".");
closedir函数
关闭打开的目录
int closedir(DIR *dirp);
成功:0;
失败:-1 设置errno为相应值。
readdir函数
读取目录(库函数)
struct dirent *readdir(DIR *dirp);
成功:返回目录项结构体指针;
失败:返回NULL设置errno为相应值
需注意返回值,读取数据结束时也返回NULL值,所以应借助errno进一步加以区分。
目录操作函数:
DIR *opendir(char *name);
int closedir(DIR *dp);
struct dirent *readdir(DIR *dp);
使用以上三个函数实现ls功能
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <dirent.h>
int main(int argc,char *argv[])
{
DIR *dp;
struct dirent *dpp;
dp=opendir(argv[1]);
if(dp==NULL)
{
perror("opendir error");
exit(1);
}
while((dpp=readdir(dp))!=NULL)//每次返回一个目录项
{
if(strcmp(dpp->d_name,".")==0)
continue;
if(strcmp(dpp->d_name,"..")==0)
continue;
printf("%s\t",dpp->d_name);
}
printf("\n");
closedir(dp);
return 0;
}
执行结果如下:
使用ulimit -a参数查看
递归遍历目录:ls -R
查询指定目录,递归列出目录中的文件,同时显示文件大小。
ls_R.c
1.判断命令行参数,获取用户要查询的目录名。
argv
2.判断用户指定的是否是目录。stat S_ISDIR();
3.读目录
opendir
while(readdir())
{
普通文件直接打印
目录:
拼接目录访问绝对路径。sprintf (path,"%s/%s",dir,d_name) dir/d_name
递归调用自己. ------> opendir(path) readdir() closedir
进去
}
closedir
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <string.h>
void read_dir(char *dir);
void isFile(char *name);
void read_dir(char *dir)
{
char path[256];
DIR *dp;
struct dirent *sdp;
dp=opendir(dir);
if(dp==NULL){
perror("opendir error");
return ;
}
while((sdp = readdir(dp))!=NULL){
if((strcmp(sdp->d_name,".")==0) || (strcmp(sdp->d_name,"..")==0))
{
continue;
}
sprintf(path,"%s/%s",dir,sdp->d_name);
isFile(path);
}
closedir(dp);
return ;
}
void isFile(char *name)
{
int ret = 0;
struct stat sb;
ret = stat(name,&sb);
if(ret == -1)
{
perror("stat error");
return ;
}
if(S_ISDIR(sb.st_mode))
{
read_dir(name);
}
printf("%10s\t%ld\n",name,sb.st_size);
return;
}
int main(int argc,char *argv[])
{
if(argc==1)
{
isFile(".");
}
else
{
isFile(argv[1]);
}
return 0;
}
执行结果如下:
文件描述符:
PCB进程控制块:本质 结构体
成员:文件描述符表
文件描述符:0/1/2/3/4/5..................................................../1023 表中可用的最小
0——STDIN_FILENO
1——STDOUT_FILENO
2——STDERR_FILENO