目录
文件描述符和文件流指针的转换
fileno
文件流指针转换成文件描述符
int fileno(FILE *stream); //函数原型
//参数
//stream 文件流指针
//返回值 成功返回文件描述符,失败返回-1
fdopen
文件描述符转文件流指针
FILE *fdopen(int fd, const char *mode); //函数原型
//参数
//fd 文件描述符
//mode 文件的权限,注意:是字符串类型,应该选择标准IO fopen中的mode选项
//返回值 成功返回文件流指针,失败返回NULL
目录操作
将目录当文件看,只不过操作函数和操作文件函数不一样
步骤:
1.代开目标目录
2.读取目录
3. 关闭目录
相关函数
opendir
DIR *opendir(const char *name); //函数原型
//功能
//打开目录
//参数
//name 目录的名称,也可填路径名称
//返回值
//成功 返回目录流指针,失败则返回NULL
readdir
struct dirent *readdir(DIR *dirp); //函数原型
//功能
//读取目录
//参数
//dirp 目录流指针
//返回值
//成功 返回struct dirent 类型的结构体,失败或者读到目录结尾则返回NULL
//结构体内容
struct dirent {
ino_t d_ino; /* 目录编号 */
off_t d_off; /* 偏移量*/
unsigned short d_reclen; /* 表示dirent结构体的长度*/
unsigned char d_type; /* 目录类型 */
char d_name[256]; /* 目录名字 */
};
closedir
int closedir(DIR *dirp); //函数原型
//功能
//关闭目录
//参数
//dirp 目录流指针
//返回值
//关闭成功返回0,失败返回-1
用上述三个函数完成目录的遍历
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <dirent.h>
#include <dirent.h>
int main(int argc, const char *argv[])
{
DIR *dir = opendir("./"); //打开当前目录
if (dir == NULL) //判断是否成功打开
{
fprintf(stderr,"opendir error\n");
return -1;
}
while (1)
{
struct dirent *info = readdir(dir); //读取目录
if (info == NULL) //判断是否读完目录,读完退出循环
{
break;
}
printf("%s\n",info->d_name); //打印出目录结构体中的文件名
}
closedir(dir); //关闭目录
return 0;
}
chdir
int chdir(const char *path); //函数原型
//功能
//切换目录
//参数
//path 目录的路径
//返回值
//成功切换到正确路径的目录返回0,失败则返回-1
getcwd
char *getcwd(char *buf, size_t size); //函数原型
//功能
//获取当前工作目录的路径
//参数
//buf 表示工作路径字符串存储到哪个空间
//size 表示读取这个字符串多大,防止读取时目录字符串过长超出buf大小
//返回值
//成功读取当前工作目录返回buf的首地址,失败则返回NULL
实例:找到某个目录中的.c文件打印在屏幕上
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <dirent.h>
#include <string.h>
int main(int argc, const char *argv[])
{
if (argc < 2)
{
fprintf(stderr,"input a pathname\n"); //如果传入的参数小于2个,则提示传入路径
return -1;
}
int c = chdir(argv[1]); //切换到目标路径
if (c == -1)
{
fprintf(stderr,"chdir error\n");
return -1;
}
DIR *dir = opendir("./"); //打开当前目录
while (1)
{
struct dirent * info = readdir(dir); //读取当前目录
if (info == NULL)
{
break;
}
int len = strlen(info->d_name);
if ((info->d_name)[len-1] == 'c' && (info->d_name)[len-2] == '.') //如果文件以.c结尾,就打印出来
{
printf("%s\n",info->d_name);
}
}
closedir(dir); //关闭目录
return 0;
}
mkdir
int mkdir(const char *pathname, mode_t mode); //函数原型
//功能
//创建一个目录
//参数
//pathname 目录名
//mode 目录的权限
//返回值
//成功创建目录时返回0,错误发生返回-1
rmdir
int rmdir(const char *pathname); //函数原型
//功能
//删除一个目录 这个函数只能删除空目录
//参数
//pathname 目录名,可以是路径名
//返回值
//成功删除返回0,失败或者出错返回-1
stat
int stat(const char *pathname, struct stat *statbuf); //函数原型
//功能
//获取文件或者目录的详细信息
//参数
//pathname 目录名或者路径
//statbuf struct stat 类型的结构体的地址
//返回值
//成功写入结构体则返回0,失败则返回-1
通过man手册可以查询到以下带参宏,将返回的结构体中的mode填入以下宏中,可以盘算文件的类型
S_ISREG(m) is it a regular file?
S_ISDIR(m) directory?
S_ISCHR(m) character device?
S_ISBLK(m) block device?
S_ISFIFO(m) FIFO (named pipe)?
S_ISLNK(m) symbolic link? (Not in POSIX.1-1996.)
S_ISSOCK(m) socket? (Not in POSIX.1-1996.)
通过mode与下列宏进行位与的操作可以判断该文件的权限
S_IRUSR 00400 owner has read permission
S_IWUSR 00200 owner has write permission
S_IXUSR 00100 owner has execute permission
S_IRGRP 00040 group has read permission
S_IWGRP 00020 group has write permission
S_IXGRP 00010 group has execute permission
S_IROTH 00004 others have read permission
S_IWOTH 00002 others have write permission
S_IXOTH 00001 others have execute permission
使用stat函数时应多查询man手册,看清楚结构体中的成员的含义才能熟练使用
关于时间的函数
time
time_t time(time_t *tloc); //函数原型
//功能
//获取1970年至今的时间(秒数)
//参数
//
//返回值
//
//使用方法
time_t tm;
time(&tm); //方法一
tm = time(NULL); //方法二
localtime
struct tm *localtime(const time_t *timep); //函数原型
//功能
//将秒数转换成正常时间形式
//参数
//timep time_t类型的指针
//返回值
//返回一个struct tm类型的结构体
ctime
char *ctime(const time_t *timep); //函数原型
//功能
//转换时间
//参数
//timep time_t 类型的指针
//返回值
//成功返回一个字符串