码迷,mamicode.com
首页 > 其他好文 > 详细

文件目录相关函数

时间:2020-02-29 17:33:44      阅读:71      评论:0      收藏:0      [点我收藏+]

标签:大于   parse   长度   需求   null   rmi   each   递归   count   

//-rw-rw-r-- 2 zijiao zijiao 16 Feb 24 13:20 hello

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <time.h>
#include <pwd.h>
#include <grp.h>

int main(int argc, char* argv[]){
    if(argc!=2){
        printf("need filename\n");
        return -1;
    }
    //stat func to get file information
    struct stat sb;
    stat(argv[1],&sb);

    //parse the info st_mode, uid, gid, time 
    //st_mode 
    char stmode[11]={0};
    memset(stmode,-,10);
    if(S_ISREG(sb.st_mode)) {
        stmode[0]=-;
    }
    if(S_ISDIR(sb.st_mode)){
        stmode[0]=d;
    }
    if(S_ISCHR(sb.st_mode)){
        stmode[0]=c;
    }
    if(S_ISBLK(sb.st_mode)){
        stmode[0]=b;
    }
    if(S_ISFIFO(sb.st_mode)){
        stmode[0]=p;
    }
    if(S_ISLNK(sb.st_mode)){
        stmode[0]=l;
    }
    if(S_ISSOCK(sb.st_mode)){
        stmode[0]=s;
    }
    
    //parse permission
    if(sb.st_mode & S_IRUSR) stmode[1]=r;
    if(sb.st_mode & S_IWUSR) stmode[2]=w;
    if(sb.st_mode & S_IXUSR) stmode[3]=x;
    
    if(sb.st_mode & S_IRGRP) stmode[4]=r;
    if(sb.st_mode & S_IWGRP) stmode[5]=w;
    if(sb.st_mode & S_IXGRP) stmode[6]=x;
    
    if(sb.st_mode & S_IROTH) stmode[7]=r;
    if(sb.st_mode & S_IWOTH) stmode[8]=w;
    if(sb.st_mode & S_IXOTH) stmode[9]=x;
    
    //username, groupname can be obtained by func getpwuid and getgrgid 
    
    //time can be obtained by func localtime
    struct tm *filetm=localtime(&sb.st_atim.tv_sec);
    char timebuf[20];
    sprintf(timebuf, "%dmonth  %dday %02d:%02d", filetm->tm_mon+1, filetm->tm_mday, filetm->tm_hour, filetm->tm_min);
    printf("%s %d %s %s %d %s %s", stmode, sb.st_nlink,getpwuid(sb.st_uid)->pw_name, 
           getgrgid(sb.st_gid)->gr_name, sb.st_size,timebuf ,argv[1]);
    return 0;
}

stat 函数实现 ls -l

若查看软链接的,会追溯到源文件。若只想查看软连接,需 lstat

 

技术图片

 

 技术图片

 

 技术图片

 

 技术图片

 

 技术图片

 

 技术图片

 

 

 

 

 

access 函数查看文件权限

技术图片

 

 

 

查看最大可以打开的文件数

技术图片

 3-1023

技术图片

 

 

truncate 截断文件

技术图片

 

 可用于扩展文件, 长度大于源文件就扩展。

技术图片

 

 截断文件到4B, 长度小于源文件就截断。

 

 

link 函数

技术图片

 

 

 

技术图片

创建硬连接

 

技术图片

 创建软链接

 

技术图片

 获取软链接源文件

 

 

技术图片

技术图片

 unlink删除链接

注意: unlink("hello") hello这个文件就被删除了

 

技术图片

 可以写入,但是文件最后不存在。unlink删除硬连接计数,若到0,则删除文件,如果有进程引用当前文件,先不删除此文件,等到进程退了以后再删。

 

chown 函数

技术图片

 

 

 

rename 函数

技术图片

 改文件/目录均可

 

getcwd 获得当前工作路径

技术图片

chdir 改变工作路径

只是改变程序进程的工作路径,shell的工作路径并没有变。工作路径是进程独有的。

技术图片

 

 

 技术图片

 在bbb目录下写文件temp

 

mkdir 函数

技术图片

 

 

rmdir 函数

目录必须为空

 

需求: 统计目录下普通文件的个数,子目录递归

shell: find ./ -type f | wc -l

技术图片

#include <stdio.h>
#include <unistd.h>
#include <dirent.h>
#include <sys/types.h>
#include <string.h>
int count =0;
int fileCount(char *dir){
    //open dir
    DIR* dirp=opendir(dir);
    if(dirp==NULL){
        perror("opendir err\n");
        return -1;
    }
    struct dirent* drt=NULL;
    while((drt=readdir(dirp))!=NULL){ // if null, reach the end of dir
        if(drt->d_type==DT_DIR){
            if(strcmp(".",drt->d_name)==0 || strcmp("..",drt->d_name)==0 ) continue;
            char newdirname[256]={0};
            sprintf(newdirname,"%s/%s", dir, drt->d_name);
            fileCount(newdirname);
        }else if(drt->d_type==DT_REG){
            count++;
        }
    }
    closedir(dirp);
    return 0;
}

int main(int argc, char* argv[])
{   
    if(argc!=2){
        printf("need dir\n");
        return -1;
    }
    fileCount(argv[1]);
    printf("total file count: %d\n", count);
    return 0;
}

 

 

技术图片

 

 

 

dup 和 dup2

技术图片

 

 

 需求:执行两次输出HW,一次输出到文件中,一次输出到屏幕上

技术图片

 

文件目录相关函数

标签:大于   parse   长度   需求   null   rmi   each   递归   count   

原文地址:https://www.cnblogs.com/FEIIEF/p/12365953.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!