文件属性,目录

fileno函数(FILE* fp -> int fd) 
int fileno(FILE *stream); 

功能:获得一个文件流指针中的文件描述符

参数:stream:文件流指针

返回值:成功返回文件描述符,失败返回-1

#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
    //FILE*---> int  fd;
    FILE* fp = fopen("1.txt","r");
    if(NULL == fp)
    {
        printf("fopen error\n");
        return 1;
    }

    char buf[256]={0};
    
    int fd = fileno(fp);
    read(fd, buf,sizeof(buf)-1);
    printf("%s\n",buf);
    fclose(fp);
    return 0;
}

fdopen (int fd -> FILE *fp)

FILE *fdopen(int fd, const char *mode);

 功能:将文件描述符转化为文件流指针

 参数:fd:已经打开的文件描述符

mode:"r","r+","w","w+","a","a+"。和转之前的fd类型一致
 返回值:成功返回文件流指针,失败返回NULL。

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
int main(int argc, char *argv[])
{
    //FILE*---> int  fd;
    int fd  = open("1.txt",O_RDONLY);
    if(-1 == fd)
    {
        printf("fopen error\n");
        return 1;
    }

    char buf[256]={0};
    FILE* fp = fdopen(fd,"r");
    if(NULL == fp)
    {
        printf("fdopen error\n");
        return 1;
    }
    fgets(buf,sizeof(buf),fp);
    printf("%s\n",buf);
    fclose(fp);
    return 0;
}

注:没有特殊要求关闭文件用调用度高的。

      read函数使用是将文件看作二进制,不含'\0',所以正常读的数据要比整体数据少一个,留一个位置放'\0',而fgets()函数自带'\0'。

一、打开目录(opendir)

DIR *opendir(const char *name);

功能:打开一个目录获得一个目录流指针

参数:name:目录名

返回值:成功返回目录流指针,失败返回NULL

二、读取目录(readdir)

一次只读一个,所以要使用循环调用(while(1))。

struct dirent *readdir(DIR *dirp);

功能:从目录流中读取文件信息并将保存信息的结构体地址返回

参数:dirp:目录流指针

返回值:包含文件信息的结构体,出错或者读到目录流末尾返回NULL

三、关闭目录(closedir)

 int closedir(DIR *dirp);

功能:关闭之前已经打开的目录流对象

参数:opendir的返回结果中目录流对象

返回值:成功  0, 失败   -1;

打开读取关闭目录:

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
       #include <dirent.h>

int main(int argc, char *argv[])
{
    DIR *dir = opendir("./");
    if(NULL == dir)
    {
        printf("opendir");
        return 1;
    }

    while(1)
    {
       struct dirent * info =  readdir(dir);
       if(NULL == info)
       {
        break;
       }
       printf("%s\n",info->d_name);
    }
    closedir(dir);
    return 0;
}

四、文件属性的获取

1.stat

int  stat(const  char  *path, struct stat *buf);

功能:获得文件的属性

参数:path: 文件的路径,buf:  属性存放空间的首地址

返回值:成功返回0,失败返回-1

#include <stdio.h>
 #include <sys/types.h>
       #include <sys/stat.h>
       #include <unistd.h>
int main(int argc, char *argv[])
{
    struct stat st;
    int ret = stat("./01ls.c",&st);
    if(-1 == ret)
    {
        printf("stat error\n");
        return 1;
    }

    printf("ino:%lu mode:%d link:%lu uid:%d gid:%d size:%lu time:%lu\n",st.st_ino, st.st_mode,st.st_nlink 
           ,st.st_uid, st.st_gid,st.st_size,st.st_mtim.tv_sec);

    return 0;
}

结果为:

2.st_mode(包含文件类型和mode(0666、0777))

使用man 7 inode

五、其他

1.chdir

int chdir(const char *path);                           // /home/linux

功能:改变当前程序的工作路径

参数:path:改变到的路径

返回值:成功返回0,失败返回-1

#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
    int ret = chdir("../");
    if(-1 == ret)
    {
        printf("chdir error\n");
        return 1;
    }

    fopen("aaa","w");
    return 0;
}

2.getcwd(pwd)

char *getcwd(char *buf, size_t size);

功能:获得当前的工作路径

参数:buf:保存工作路径空间的首地址,size:保存路径空间的长度

返回值:成功返回包含路径空间的字符串首地址,失败返回NULL

#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
    char buf[512]={0};
    getcwd(buf,sizeof(buf));
    printf("current path is %s\n",buf);
    int ret = chdir("../");
    if(-1 == ret)
    {
        printf("chdir error\n");
        return 1;
    }
    
    getcwd(buf,sizeof(buf));
    printf("after change path is %s\n",buf);
    return 0;
}

3.mkdir

int mkdir(const char *pathname, mode_t mode);      //777  666 --x--x--x

功能:创建一个目录

参数:pathname:路径

mode:如0666、0777一样的权限,mode & ~umask  0002

返回值:成功返回0,失败返回-1

#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
int main(int argc, char *argv[])
{
    int ret = mkdir("bbb",0777);  
    if(-1 == ret)
    {
        printf("mkdir error\n");
        return 1;
    }
    return 0;
}

4.rmdir

int rmdir(const char *pathname);

功能:删除一个空目录文件

参数:pathname:目录文件的名字

返回值:成功返回0,失败返回-1

  • 25
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值