文件属性、目录操作
访问目录-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");
}