目录文件的操作
1.mkdir(创建目录)
int mkdir(const char *pathname, mode_t mode); 注意: |
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); 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 要链接的文件名 硬链接文件名 源文件和链接文件共享一个innode |