文件属性、目录操作

文件属性、目录操作

访问目录-opendir

 DIR  *opendir(const char *name);
 DIR *fdopendir(int fd);//使用文件描述符,要配合open函数使用
//头文件 dirent.h

1.DIR是用来描述一个打开的目录文件的结构体类型;
2.成功时返回目录流指针;出错时返回NULL;

访问目录 – readdir

struct  dirent *readdir(DIR *dirp);
//头文件 <dirent.h>
//readdir函数用来读取目录流中的内容

1.struct dirent是用来描述目录流中一个目录项的结构体类型;

2.包含成员char d_name[256];

3.成功时返回目录流dirp中下一个目录项;

4.出错或到末尾时时返回NULL;

访问目录 – closedir

int closedir(DIR *dirp);
//头文件 <dirent.h>

成功时返回0;出错时返回EOF(-1);

示例代码:

#include<dirent.h>
int main(int arg,char**argv)
{
	struct dirent * dt;
	DIR *dp;
	dp = opendir("参数为一个目录");
	if(dp < 0)
	{
		perror("opendir");
		return 0;
	}
	while((dt = readdir(dp)) ! = NULL)
	{
		printf("%s\n",dt->d_name);
	}

  closedir(dp);
}

修改文件访问权限-chmod/fchmod

int  chmod(const char *path, mode_t mode);
int  fchmod(int fd, mode_t mode);
//头文件 <sys/stat.h> 
//用来修改文件的访问权限

1.成功时返回0;出错时返回EOF;

2.root和文件所有者能修改文件的访问权限;

3.如果在windows和Linux共享文件夹,无法正常修改文件权限;

示例:

chmod(“test.txt”, 0666);

获取文件属性-stat/lstat/fstat

int  stat(const char *path, struct stat *buf);
int  lstat(const char *path, struct stat *buf);
int  fstat(int fd, struct stat *buf);
//头文件 <sys/stat.h> 用来获取文件属性

1.成功时返回0;出错时返回EOF;

2.如果path是符号链接stat获取的是目标文件的属性;而lstat获取的是链接文件的属性;

3.获得到的文件属性写到buf结构体中;

文件属性–struct stat

struct stat是存放文件属性的结构体类型:

mode_t st_mode; 类型和访问权限
uid_t st_uid; 所有者id
uid_t st_gid; 用户组id
off_t st_size; 文件大小
time_t st_mtime; 最后修改时间

stat结构体:

struct stat {
    dev_t         st_dev;       //文件的设备编号
    ino_t         st_ino;       //节点
    mode_t        st_mode;      //文件的类型和存取的权限
    nlink_t       st_nlink;     //连到该文件的硬连接数目,刚建立的文件值为1
    uid_t         st_uid;       //用户ID
    gid_t         st_gid;       //组ID
    dev_t         st_rdev;      //(设备类型)若此文件为设备文件,则为其设备编号
    off_t         st_size;      //文件字节数(文件大小)
    unsigned long st_blksize;   //块大小(文件系统的I/O 缓冲区大小)
    unsigned long st_blocks;    //块数
    time_t        st_atime;     //最后一次访问时间
    time_t        st_mtime;     //最后一次修改时间
    time_t        st_ctime;     //最后一次改变时间(指属性)
};

文件类型–st_mode

通过系统提供的宏来判断文件类型:
S_IFMT      							 0170000     文件类型的位遮罩
S_ISREG(st_mode)           0100000     是否常规文件
S_ISDIR(st_mode)           0040000    是否目录
S_ISCHR(st_mode)           0020000    是否字符设备
S_ISBLK(st_mode)           0060000    是否块设备
S_ISFIFO(st_mode)          0010000    是否FIFO文件
S_ISLNK(st_mode)           0120000    是否链接文件
S_ISSOCK(st_mode)          0140000    是否SOCKET文件

文件访问权限–st_mode

通过系统提供的宏来获取文件访问权限:

S_IRUSR           00400     	 bit:8    所有者有读权限
S_IWUSR           00200            7    所有者拥有写权限
S_IXUSR           00100            6    所有者拥有执行权限
S_IRGRP           00040            5    群组拥有读权限
S_IWGRP           00020            4    群组拥有写权限
S_IXGRP           00010            3    群组拥有执行权限
S_IROTH           00004            2    其他用户拥有读权限
S_IWOTH           00002            1    其他用户拥有写权限
S_IXOTH           00001            0    其他用户拥有执行权限

示例:打印文件的权限和创建时间

#include<stdio.h>
#incldue<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>

int main(int argc,char**argv[])
{
  int ret;
  int i;
	struct stat buf;
  struct tm * t;
	ret = stat("文件名字",&buf);
  if(ret < 0)
  {
    perror("stat");
    return 0;
  }
  //判断文件类型
  if(S_ISREG(buf,st_mode))
  {
    printf("-");
  }
  if(S_ISDIR(buf,st_mode))
  {
    printf("d");
  }
  if(S_ISCHR(buf,st_mode))
  {
    printf("c");
  }
  if(S_ISBLK(buf,st_mode))
  {
    printf("b");
  }
  if(S_ISFIFO(buf,st_mode))
  {
    printf("p");
  }
  if(S_ISSOCK(buf,st_mode))
  {
    printf("s");
  }  
  
  //打印文件的权限
  for(i = 8,i > = 0;i--)
  {
    if(buf.st_mode & (1<<i))
    {
      switch(I%3)
      {
        case 2:
          printf("r");
          break;
        case 1:
          printf(“w”);
          break;
        case 0:
          printf(“x”);
          break;
      }
      else
        printf("-");
    }
  }
  printf(" %d",(int)buf,st_size);
  t = localtime(&buf.st_ctime);
  printf(" %d-%d-%d %d:%d",t->tm_year+1900,t->tm_mon+1,t->tm_mday,t->tm_hour,t->tm_min);
  
  printf("chmod_t.c\n");
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值