目录:目录文件
文件中保存:字符文本 二进制
目录文件中保存:文件名
打开目录:opendir
进程获取了硬盘中一个区域的访问权限并映射到内存中。
#include <sys/types.h>
#include <dirent.h>
进程获取了硬盘中一个区域的访问权限并映射到内存中。
#include <sys/types.h>
#include <dirent.h>
DIR *opendir(const char *name);
DIR *fdopendir(int fd);//ioctl
DIR* 相当于 FILE*
读打开了的目录:
readdir man 3
#include <sys/types.h>
#include <dirent.h>
DIR *fdopendir(int fd);//ioctl
DIR* 相当于 FILE*
读打开了的目录:
readdir man 3
#include <sys/types.h>
#include <dirent.h>
struct dirent *readdir(DIR *dir);//opendir的返回值
readdir函数内部会开辟sizeof(struct dirent)大小的内存并给这段内存赋值,最后返回这段的内存的首地址
struct dirent {
ino_t d_ino; //节点 整数 表示文件在虚拟文件系统中的位置
off_t d_off; //偏移量 目录中位置
unsigned short d_reclen; //记录长度
unsigned char d_type; //文件类型
char d_name[256]; //文件名
};
readdir函数内部会开辟sizeof(struct dirent)大小的内存并给这段内存赋值,最后返回这段的内存的首地址
struct dirent {
ino_t d_ino; //节点 整数 表示文件在虚拟文件系统中的位置
off_t d_off; //偏移量 目录中位置
unsigned short d_reclen; //记录长度
unsigned char d_type; //文件类型
char d_name[256]; //文件名
};
d_type:有一些匹配的预定义宏
DT_REG 普通文件
DT_DIR 目录文件
DT_REG 普通文件
DT_DIR 目录文件
。。。。。。。。。。。。。。。。。。。。。。。。。。。
ls例子
#include <string.h>
#include <stdlib.h>
int main(int argc, char const *argv[])
{
DIR* dir = NULL;
struct dirent* dirent = NULL;
char dir_name[20] = {0};
if(argc == 1){
dir_name[0] = '.';
}else if(argc == 2){
strcpy(dir_name,argv[1]);
}else{
printf("输入错误!\n");
exit(-1);
}
dir = opendir(dir_name);
while(1){
dirent = readdir(dir);
if(dirent == NULL) //空目录退出
break;
if(dirent->d_name[0] == '.') //不显示点开头的文件
continue;
printf("%s\t",dirent->d_name); //显示文件名
}
printf("\n");
closedir(dir);
return 0;
}
/*
打印目录中所有内容,包括目录下目录的内容
*/
#include <stdio.h>
#include <dirent.h>
void print(char* n){
char dir_name[256] = {0};
DIR* dirp = NULL;
struct dirent* dirent = NULL;
dirp = opendir(n);
while(1){
dirent = readdir(dirp);
if(dirent == NULL)//没有文件了,退出
break;
if(dirent->d_name[0] == '.')//是.和..忽略
continue;
if(dirent->d_type == DT_DIR){//是目录,需要进一步打印
printf("%s/%s ",n,dirent->d_name);
sprintf(dir_name,"%s/%s",n,dirent->d_name);
//printf("::%s\n",dir_name);
print(dir_name);
}
if(dirent->d_type == DT_REG)//是文件,打印就完了
printf("%s/%s ",n,dirent->d_name);
}
printf("\n");
closedir(dirp);
}
int main(){
char dir_name[256] = {0};
printf("请输入要显示内容的目录名:");
scanf("%s",dir_name);
print(dir_name);
return 0;
}