文件I/O中使用opendir
函数来打开一个目录文件
头文件:#include
DIR *opendir(const char *name);
文件I/O使用readdir
函数来读取目录流中的内容
#include
struct dirent *readdir(DIR *dirp);
文件I/O使用closedir
来关闭一个已经打开的目录文件
#include
int close(DIR *dirp);
例1:打印指定目录下所有的文件名称,指定目录由命令行参数确认
#include
#include
#include
#include
int main(int argc,char * argv[])
{
DIR *dirp;
struct dirent *dp;
if(argc<2)
{
printf("Usage:%s \n" ,argv[0]);
return -1;
}
if((dirp=opendir(argv[1]))==NULL)
{
perror("opendir");
return -1;
}
while((dp=readdir(dirp))!=NULL)
{
printf("%s\n",dp->d_name);
}
closedir(dirp);
return 0;
}
效果如下:
linux@linux:~/test/lv4/Day3$ ls
001 002 opendir opendir.c
linux@linux:~/test/lv4/Day3$ ./opendir 001
001.txt
..
002.txt
.
man readdir查看struct dirent结构体中的内容,它就用来存储所读取的目录的相关信息
上面的例子,只用到了d_name这一项
小结:
操作 | |
---|---|
打开 | DIR * opendir(目录文件路径) |
读取 | struct dirent * readdir(之前打开的目录流指针) |
关闭 | int closedir(之前打开的目录流指针) |
文件I/O用chmod / fchmod
函数来修改文件的访问权限
#include
int chmod(const char *path,mode_t mode);
int fchmod(int fd,mode_t mode);
ls -l:列出长数据串,显示出文件的属性与权限等数据信息(常用)
这个功能我们也可以用以下函数实现
文件I/O使用stat / lstat / fstat
来获取文件的属性
#include
int stat(const char * path,struct stat * buf);
int lstat(const char * path,struct stat * buf);
int fstat(int fd, struct stat * buf);
./a.out test.c
-rw-r--r-- 317(文件大小) 2014-11-8(文件最后修改时间) test.c(文件名)
要求:调用stat 函数来获取文件属性
从stat结构体中获取相应的信息并输出
#include
#include
#include
#include
#include
#include
int main(int argc,char *argv[])
{
struct stat buf;
int n;
struct tm *tp;
if(argc<2)
{
printf("Usage:%s \n" ,argv[0]);
return -1;
}
if(stat(argv[1],&buf)<0)
{
perror("stat");
return -1;
}
//判断文件类型 将文件的st_mode 与类型掩码 S_IFMT 相与
switch(buf.st_mode & S_IFMT)
{
case S_IFREG:
printf("regular file\n");break;
case S_IFBLK:
printf("block device\n");break;
case S_IFDIR:
printf("directory\n");break;
case S_IFLNK:
printf("symlink\n");break;
case S_IFSOCK:
printf("socket\n");break;
default:
printf("Other type\n");break;
}
//输出文件权限
//通过系统提供的宏来获取文件的权限
for(n=8;n>=0;n--)
{
if(buf.st_mode & (1<<n) )
{
switch(n % 3)
{
case 2:
printf("r");break;
case 1:
printf("w");break;
case 0:
printf("x");break;
}
}
else
{
printf("-");
}
}
printf(" %lu",buf.st_size);//文件大小
tp=localtime(&buf.st_mtime);//先转换成本地时间
printf(" %d-%02d-%02d",tp->tm_year+1900,tp->tm_mon+1,tp->tm_mday);
printf(" %s\n",argv[1]);//输出文件名
return 0;
}
效果如下
linux@linux:~/test/lv4/Day3$ gcc stat.c -o stat
linux@linux:~/test/lv4/Day3$ ./stat stat.c
regular file
rw-r--r-- 1293 2020-05-21 stat.c