【Linux--lv4--Day3】文件I/O-访问目录、读取目录、修改文件权限、获取文件属性

文章目录

      • 文件I/O
        • 访问目录
        • 读取目录
        • 关闭目录
        • 修改文件的访问权限
        • 获取文件属性

文件I/O

访问目录

文件I/O中使用opendir函数来打开一个目录文件
头文件:#include
DIR *opendir(const char *name);

  • 参数为要打开的目录文件的路径
  • DIR是一个用来描述打开的目录文件的结构体类型
  • 成功时返回目录流指针;出错时返回NULL

读取目录

文件I/O使用readdir函数来读取目录流中的内容
#include
struct dirent *readdir(DIR *dirp);

  • 参数为之前打开的目录流指针
  • struct dirent是用来描述目录流中的一个目录项的结构体类型
  • 包含成员char d_name[256] 等成员,可以参考帮助文档(man readdir)
  • 成功时返回目录流dirp的下一个目录项,出错或者到末尾时返回NULL

关闭目录

文件I/O使用closedir来关闭一个已经打开的目录文件
#include
int close(DIR *dirp);

  • 成功时返回0,出错时返回EOF

例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这一项
【Linux--lv4--Day3】文件I/O-访问目录、读取目录、修改文件权限、获取文件属性_第1张图片
小结:

操作
打开 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);

  • 更推荐直接使用chmod,更方便快捷
  • 成功返回0,出错返回EOF
  • 注意:只有root 和文件所有者才能修改文件的访问权限
  • ex: chmod(“001.txt”,0666);

获取文件属性

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);

  • 推荐使用stat
  • 成功时返回0,出错时返回EOF
  • stat 与 lstat 的区别
    – 如果path 是符号链接,stat获取的是链接文件所指向的目标文件的属性,而lstat 获取的是这个链接文件本身的属性
    注意:
    上述函数中有 struct stat 这个结构体类型,它专门用来存储文件的属性(包含文件权限、文件类型等属性)
    man 2 stat
    【Linux--lv4--Day3】文件I/O-访问目录、读取目录、修改文件权限、获取文件属性_第2张图片
    再来查看文件类型 st_mode
    【Linux--lv4--Day3】文件I/O-访问目录、读取目录、修改文件权限、获取文件属性_第3张图片
    例2:以下面的格式打印指定文件的主要信息(类似于ls -l 的功能)
./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

你可能感兴趣的:(Linux网课视频笔记)