目录
1. fileno
int fileno(FILE *stream);
功能 : 获得一个文件流指针中的文件描述符
参数:
stream : 文件流指针
返回值 : 成功返回文件描述符,失败返回-1
2.fdopen
FILE *fdopen(int fd, const char *mode);
功能 : 将文件描述符转化为文件流指针
参数:
fd : 已经打开的文件描述符
mode:(拿到文件为什么模式就传什么模式,不能改权限)
"r"
"r+"
"w"
"w+"
"a"
"a+"
返回值 : 成功返回文件流指针,失败返回NULL
注:这两个函数的关闭要拿封装度搞得关文件,任何一个关掉后,另一个就不能再用了。
3. 目录操作
一般流程:
1、打开目标目录
2、读取目录,,
3、关闭目录
3.1 opendir
DIR *opendir(const char *name);
功能:打开一个目录获得一个目录流指针
参数:
name :目录名
返回值:成功返回目录流指针,失败返回NULL
3.2 readdir
struct dirent *readdir(DIR *dirp);
功能:从目录流中读取文件信息并将保存信息的结构体
参数:
dirp:目录流指针
返回值:包含文件信息的结构体,出错或者读到目录流末尾返回NULL
3.3 closedir
int closedir(DIR *dirp);
功能:关闭之前已经打开的目录流对象
参数:opendir的返回结果中目录流对象
返回值:成功 0,失败 -1;
3.4 实现 ls 命令的功能
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <dirent.h>
int main(int argc, char *argv[])
{
DIR * dir = opendir("./"); // 打开当前目录
if(NULL == dir)
{
fprintf(stderr,"opendir errpr\n");
return 1;
}
while(1)
{
struct dirent * info = readdir(dir); // 读取目录中的文件
if(NULL == info)
{
break;
}
switch(info->d_type) // 判断文件类型
{
case DT_DIR:
printf("目录文件 ");
break;
case DT_REG:
printf("普通文件 ");
break;
case DT_UNKNOWN:
printf("其他文件 ");
break;
default:
printf("未知文件 ");
}
printf("%s\n",info->d_name);
}
closedir(dir);
return 0;
}
4. chdir (相当于cd命令)
int chdir(const char *path);
功能 :改变当前程序的工作路径
参数:
path:改变到的路径
返回值:成功返回0,失败返回-1
#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
int ret = chdir("..");
if(-1 == ret)
{
fprintf(stderr,"chdir error\n");
return 1;
}
return 0;
}
5. getcwd (相当于pwd命令)
char *getcwd(char *buf, size_t size);
功能:获得当前的工作路径
参数:
buf:保存工作路径空间的首地址
size:保存路径空间的长度(最大接收长度,如果没有这个buf可能越界)
返回值:成功返回包含路径空间的字符串首地址,失败返回NULL
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
char buf[256]={0};
getcwd(buf,sizeof(buf));
printf("current path is %s\n",buf);
chdir("../");
getcwd(buf,sizeof(buf));
printf("change path is %s\n",buf);
return 0;
}
6. mkdir
int mkdir(const char *pathname, mode_t mode); // mode得写为0777
功能:创建一个目录
参数:
pathname:路径
mode:一般为0777,,
返回值:成功返回0,失败返回-1
#include <stdio.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
int main(int argc, char *argv[])
{
int ret = mkdir("aaa",0777);
if(-1 == ret)
{
fprintf(stderr,"mkdir error\n");
return 1;
}
return 0;
}
7. rmdir (相当于rm命令)
int rmdir(const char *pathname);
int rmdir(const char *pathname);
功能:删除一个空目录文件
参数:
pathname:目录文件的名字
返回值:成功返回0,失败返回-1
#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
int ret = rmdir("./aaa");
if(-1 == ret)
{
fprintf(stderr,"rmdir error\n");
return 1;
}
return 0;
}
8. stat
int stat(const char *path, struct stat *buf);
功能:获得文件的属性
参数:
path :文件的路径
buf: 属性存放空间的首地址
返回值:成功返回0,失败返回-1
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
int main(int argc, char *argv[])
{
struct stat st;
char filename[]="./01ls.c";
int ret= stat(filename,&st);
if(-1 == ret)
{
fprintf(stderr,"stat error\n");
return 1;
}
printf("ino:%lu mode:%d link:%lu uid:%u gid:%u size:%lu time:%lu
%s\n",st.st_ino,st.st_mode,st.st_nlink
,st.st_uid,st.st_gid,st.st_size,st.st_mtime,filename);
return 0;
}
9. 关于时间的函数
9.1 time
功能:获得1970年到现在的秒数
参数:
t:存放秒数的空间首地址
返回值:成功返回1970年到现在的秒数,失败返回-1
#include <time.h>
#include <stdio.h>
int main(int argc, char *argv[])
{
time_t tm;
time(&tm);
printf("%ld\n",tm);
return 0;
}
9.2 localtime
struct tm *localtime(const time_t *timep);
功能:将一个秒数转化成日历时间
参数:
timep:保存秒数空间的地址
返回值:成功返回保存日历时间结构体的指针,失败返回NULL
struct tm
{
int tm_sec; /* seconds */
int tm_min; /* minutes */
int tm_hour; /* hours */
int tm_mday; /* day of the month */
int tm_mon; /* month */
int tm_year; /* year */
int tm_wday; /* day of the week */
int tm_yday; /* day in the year */
int tm_isdst; /* daylight saving time */
};
#include <time.h>
#include <stdio.h>
int main(int argc, char *argv[])
{
time_t tm;
time(&tm);
struct tm * t= localtime(&tm);
printf("%d-%d-%d %d:%d:%d\n",t->tm_year+1900 ,t->tm_mon+1,t->tm_mday,t->tm_hour
,t->tm_min,t->tm_sec);
return 0;
}
9.3 ctime
char *ctime(const time_t *timep);
功能:将时间秒数转化成字符串
参数:
timep:保存时间空间的地址
返回值:成功返回获得时间字符串的首地址,失败返回NULL
#include <time.h>
#include <stdio.h>
int main(int argc, char *argv[])
{
time_t tm;
time(&tm);
printf("%s\n",ctime(&tm));
return 0;
}
10. uid 和 gid
10.1 getpwuid
struct passwd *getpwuid(uid_t uid);
功能:根据用户id到/etc/passwd文件下解析获得
结构体信息
参数:
uid:用户id
返回值:成功返回id对应用户的信息,失败返回NULL
#include <sys/types.h>
#include <pwd.h>
#include <stdio.h>
int main(int argc, char *argv[])
{
uid_t uid = 1000;
struct passwd * pw = getpwuid(uid);
if(NULL== pw)
{
fprintf(stderr,"getpwuid error\n");
return 1;
}
printf("name:%s gid:%d info:%s dir:%s shell:%s\n",pw->pw_name,pw->pw_gid,pw->pw_gecos
,pw->pw_dir,pw->pw_shell);
return 0;
}
10.2 getgrgid
struct group *getgrgid(gid_t gid);
功能:根据gid到/etc/group文件中解析组信息
参数:
gid:组id
返回值:成功返回组信息,失败返回NULL
#include <stdio.h>
#include <sys/types.h>
#include <grp.h>
int main(int argc, char *argv[])
{
gid_t gid = 1000;
struct group * gr = getgrgid(gid);
if(NULL == gr)
{
fprintf(stderr,"getgrgid\n");
return 1;
}
printf("name:%s gid:%d ",gr->gr_name,gr->gr_gid);
int i = 0 ;
while(NULL!=gr->gr_mem[i])
{
printf("%s\n",gr->gr_mem[i]);
i++;
}
return 0;
}