#include <sys/stat.h>
int stat(const char *path, struct stat *buf);
int fstat(int fd, struct stat *buf);
int lstat(const char *path, struct stat *buf);
返回值:
如果成功返回0,
如果失败返回-1
stat用来把path指定的文件(包含目录或设备等)的状态及属性信息
保存到由buf指向的结构体struct stat中去。fstat功能与stat相同,只不过由文件描述符指定文件。
lstat功能与stat相同,只不过当path是一个符号链接时,获取的是
符号链接本身的状态属性信息,而不是它指向的文件。
struct stat在linux/unix用来保存文件属性信息的结构体
struct stat {
dev_t st_dev; //dev_t是用来保存设备号的类型
//st_dev是容纳该文件的那个设备的设备号
ino_t st_ino; //该文件的I-node的号码
mode_t st_mode; //文件权限(包含文件类型)
nlink_t st_nlink; //硬链接的数目
uid_t st_uid; //文件的属主(user)的ID
gid_t st_gid; //文件属主的GROUP ID
dev_t st_rdev; //该文件的设备号,当该文件本身是一个设备时
off_t st_size; //文件内容的长度,以字节为单位。
//符号链接文件的内容是它指向的文件的文件名
//st_size仅对普通文件和符号链接有意义
blksize_t st_blksize; //块大小(与具体的硬件相关)
blkcnt_t st_blocks; //文件占多少块block(在linux下每个块占512字节)
time_t st_atime; //最后访问的时间。读 "文件内容"
time_t st_mtime; //最后修改文件的时间。"文件内容"
time_t st_ctime; //最后改变文件的时间。"文件属性" i-node
};
st_mode这个成员变量包含了文件权限和文件类型。
文件权限是用位域实现:
S_IRUSR S_IWUSR S_IXUSR
S_IRGRP S_IWGRP S_IXGRP
S_IROTH S_IWOTH S_IXOTH
文件类型:用下列宏来解析
S_ISREG(buf->st_mode) : 普通文件 -
S_ISDIR() : 目录文件 d
S_ISCHR() : 字符设备文件 c
S_ISBLK() : 块设备文件 b
S_ISFIFO() : 管道文件 p
S_ISLNK() : 符号链接文件 l
S_ISSOCK() : socket文件 s
#include <dirent.h>
1. 创建、删除一个空目录
int mkdir(const char *pathname, mode_t mode);
用指定的名字建立目录。 缺省时,新建立的目录模式为0777,即不加保护地对所有人
都可读、可写、可执行。
其中参数pathname是新创建目录的目录名,mode指定该目录的访问权限,这些位将受到文件创建
方式屏蔽(umask)的修正。该函数创建一个名为pathname的空目录,此目录自动含有“.”和“..”2个登记项。
这个新创建目录的用户ID被设置为调用进程的有效用户ID,其组则为父目录的组ID或者进程的有效组ID。
若调用成功,mkdir将更新该目录的st_atime、st_ctime和st_mtime,同时更新其父目录的st_ctime和st_mtime,
然后返回0。
若调用失败,mkdir将返回-1.
由pathname指定的新目录的父目录必须存在,并且调用进程必须具有该父目录的写权限以及pathname涉及的各个分路径目录的搜寻权限。
int rmdir(const char *pathname);
使用rmdir函数时,目录必须为空,否则调用失败,函数返回-1,成功时,函数返回0.
2. 打开一个目录
opendir用来打开name指定的目录,
DIR *opendir(const char *name);
name: 要打开的目录名
返回值:
如果成功返回一个DIR的指针。
失败返回NULL。errno is set appropriately
3. 读一个目录
struct dirent *readdir(DIR *dirp);
dirp:opendir的返回值,表示一个目录
返回值:
如果成功返回下一个目录项(struct dirent)
如果读完了或者出错了则返回NULL.errno is set appropriately.
readdir用来从dirp指定的目录中,读取下一个目录项(struct dirent)并返回。
struct dirent {
ino_t d_ino; //I-node编号
off_t d_off; //偏移量,NOTE
unsigned short d_reclen; //这条记录的长度,NOTE
unsigned char d_type; //该目录项对应的文件的类型,NOTE
char d_name[256]; //文件名(不带路径)
};
NOTE:请注意不是所有的系统都支持。
4. 关闭一个目录
int closedir(DIR *dirp);
返回0为成功,返回1失败并设置error。
remove()函数用于删除指定的文件。
函数原型:int remove(char * pathname);
参 数: pathname为要删除的文件名,可以为一目录。如果参数pathname 为一文件,则调用unlink()处理;
若参数pathname 为一目录,则调用rmdir()来处理。
返 回 值: 成功则返回0,失败则返回-1 并设置error。
void delete_dir(char *path)
{
DIR *d = opendir(path); //打开这个目录
if(d == NULL)
{
perror("don't open :%s\n",path");
return;
}
struct dirent *dt = NULL;
while(dt = readdir(d)) //读目录项
{
struct stat st;
char filename[256];
sprintf(filename,"%s/%s",path,dt->d_name);
stat(filename,&st); //保存状态信息
if(S_ISREG(st.st_mode))
{
remove(filename);
}
else if(S_ISDIR(st.st_mode))
{
if(strcmp(dt->d_name,".") == 0 || strcmp(dt->d_name,"..") == 0)
continue;
delete_dir(filename);
rmdir(filename);
}
}
closedir(d);
return;
}