目录文件操作,链接文件

目录文件的操作

1.mkdir(创建目录)

int mkdir(const char *pathname, mode_t mode);
功能:
            创建目录 
参数:
            pathname:目录文件的路径 
            mode:目录文件的权限 
返回值:
            成功返回0
            失败返回-1 

注意:
        1.r 决定是否目录下可以查看其余文件信息 
        2.w 决定目录下的文件是否能够新建
        3.x 决定目录文件是否能够进入

mkdir("dirname",0777);//777代表权限为-rwx
2.rmkdir(删除空目录文件)
 int rmdir(const char *pathname);
  功能:
            删除空目录文件 
 参数:
            pathname: 目录文件的路径
返回值:
            成功返回0 
            失败返回-1 
 

rmkdir("filename");
3.getcwd(获得当前工作目录的绝对路径 )
char *getcwd(char *buf, size_t size);
功能:
            获得当前工作目录的绝对路径 
 参数: 
            buf:存放路径空间首地址
            size:最大存放字符的长度
 返回值:    
            成功返回存放路径字符串空间首地址
            失败返回NULL

char tmpbuff[4096] = {0};
getcwd(tmpbuff,sizeof(tmpbuff));
printf("当前路径:%s\n",tmpbuff);
4.chdir(切换程序当前的工作路径)
 int chdir(const char *path);
        功能:  
            切换程序当前的工作路径 
        参数:
            path:目的路径  
        返回值: 
            成功返回0 
            失败返回-1 

chdir("/home/linux/Desktop");
5.chmod(修改文件权限)
        chmod 0777 filename  
        chmod 0664 filename 
        chmod +/-r/w/x filename 
        int chmod(const char *pathname, mode_t mode);
        功能:
            修改文件权限
        参数:
            pathname:文件路径 
            mode:权限值     0777       0664  
        返回值:
            成功返回0 
            失败返回-1
 
6.opendir(打开目录)
        int closedir(DIR *dirp);
          功能:
            关闭目录流指针 
          参数:
            dirp:目录流指针
          返回值:
            成功返回0 
            失败返回-1 
7.readdir(读取目录项)

          struct dirent *readdir(DIR *dirp);
          功能:
                    读取目录项 
          参数:
                    dirp:目录流指针 
          返回值:
                    成功返回目录项指针
                    失败返回NULL 
                    读到末尾返回NULL 

struct dirent {

        ino_t d_ino; /* Inode number */

        off_t d_off; /* Not an offset; see below */

        unsigned short d_reclen; /* Length of this record */

        unsigned char d_type; /* 文件类型(宏定义) */

        char d_name[256]; /* 文件名*/

};

8.closedir(关闭目录)
        int closedir(DIR *dirp);
          功能:
            关闭目录流指针 
          参数:
            dirp:目录流指针
          返回值:
            成功返回0 
            失败返回-1 

练习:实现遍历所有目录,并打印出消耗的时间

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <dirent.h>
#include <sys/time.h>
int ListDir(char *dirname){
    DIR *dp = NULL;
    struct dirent *pp = NULL;
    char tmpbuff[256] = {0};
    
    dp = opendir(dirname);
    if(NULL == dp){
        return -1;
    }
    
    while(1){
        pp = readdir(dp);
        if(NULL == pp){
            break;
        }
        if('.' == *pp->d_name){
            continue;
        }
        
        sprintf(tmpbuff,"%s/%s\n",dirname,pp->d_name);//把dirname(父文件)/读取到的文件名(子文件)写入tmpbuff字符数组中
        printf("%s\n",tumbuff);
        if(DT_DIR == pp->d_type){
            ListDir(filepath);

        }
    }
    closedir(filename);
}
int main(void){
    char dirname[256] = {0};
    struct timval start;
    struct timeval start;
    struct timeval end; 
    long ts = 0;
   
    printf("请输入目标路径:\n");
    scanf("%s",dirname);
    
     gettimeofday(&start,NULL);
    ListDir(dirname);
    gettimeofday(&end,NULL);

    ts = (end.tv_sec*1000000+end.tv_usec)-(start.tv_sec*1000000+start.tv_usec);
    printf("%ld.%ld\n",ts/1000000,ts%1000000);

    return 0;
}

链接文件 

1.软链接

ln -s 要链接向的文件名 软链接文件名 
例:        ln -s b.txt a.txt 
                a.txt -> b.txt 

   通过文件名进行链接  

   普通文件:
    文件名 -> inode -> 数据块

   软链接: 
    软连接文件名 -> inode -> 数据块 -> 链接向的文件名 -> inode -> 数据块 


    int symlink(const char *target, const char *linkpath);
    功能:
        创建一个linkpath的软连接文件,里面存放target字符串
    参数:
         target:链接向的文件名
        linkpath:软链接文件名
    返回值:
        成功返回0 
        失败返回-1 

    ssize_t readlink(const char *restrict path, char *restrict buf, size_t bufsize);
    功能: 
        读取软链接文件本身内容(本身的内容是源文件的文件名)
    参数:
        path:软链接文件名 
        buf:存放软链接文件内容的缓冲区 
        bufsize:缓冲区的大小 
    返回值:
        成功返回读取的字节数 
        失败返回-1

#include "../head.h"

int main(void){
    FILE *fp = NULL;
    char tmpbuff[4096] = {0};
    symlink("file.txt","a.txt");
    fp = fopen("a.txt","r");
    if(NULL == fp){
        return -1;
    }
    fgets(tmpbuff,sizeof(tmpbuff),fp);
    printf("%s\n",tmpbuff);

    fclose(fp);
    memset(tmpbuff,0,sizeof(tmpbuff));//将tmpbuff数组清零
    readlink("a.txt",tmpbuff,sizeof(tmpbuff));
    printf("%s\n",tmpbuff);
    return 0;
}

2.硬链接

 ln 要链接的文件名 硬链接文件名  

        通过在磁盘中存放的inode节点进行链接
        删除文件链接关系断开

        源文件和链接文件共享一个innode

        link  
        int link(const char *oldpath, const char *newpath);
        功能:
            创建一个newpath的硬链接文件
        参数:
            oldpath:要链接的文件名
            newpath:硬链接文件名
        返回值:
            成功返回0 
            失败返回-1 

        unlink
        int unlink(const char *pathname);
        功能:
            删除链接文件名,并让硬链接个数-1 ,如果一个磁盘空间硬链接个数为0,需要回收磁盘空间
        参数:
            pathname:链接文件名
        返回值:
            成功返回0
            失败返回-1 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值