一、 文件夹的系统函数
1.mkdir(),创建一个目录文件。
int mkdir(const char *pathname, mode_t mode);
第一个参数是路径,第二个参数是权限,一般为0777.
在shell命令中,使用mkdir可以创建一个目录,如果使用mkdir aa/bb/cc创建目录,而aa不存在时,可以使用mkdir aa/bb/cc -p;
如果使用mkdir函数来创建,需要一个一个的创建。
2.access()检查是否具有某些权限,是否存在,是否有读写运行的权限等。
int access(const char *pathname, int mode);
返回:如果具有这个权限返回0,没有或者异常返回-1.
3.opendir(),打开一个目录文件
DIR *opendir(const char *name);
DIR *fdopendir(int fd);
函数返回一个DIR的指针。
4.readdir();读取目录下面的文件
struct dirent *readdir(DIR *dirp);
返回的结果是一个结构体。
struct dirent {
ino_t d_ino; /* inode 编号 */
off_t d_off; /* offset to the next dirent */
unsigned short d_reclen; /* length of this record */
unsigned char d_type; /* type of file; not supported
by all file system types */
char d_name[256]; /* 文件名称*/
};
其中文件的类型有:1.DT_REG普通文件 2.DT_LIK符号链接 3.DT_DIR目录文件 4.DT_FIFO管道文件
如果返回NULL说明遍历完了。
例题:
1.使用系统调用完成mkdir实现建立xx/yy/zz
2.完成命令ls
3.完成文件夹的复制
一 、mkdir的实现。 #include <sys/stat.h> #include <sys/types.h> #include <stdio.h> #include <string.h> #include <unistd.h> #include <stdlib.h> //仿写mkdir命令 //输入的如果是x/y/z;而x并不存在,就会一个一个的创建 //核心是分割字符串 int main(int argc,char *argv[]) { argv[1]; //对argv[1]进行分割 char * p = strtok(argv[1],"/"); int erro = 0; char * path = (char *)malloc(256); strcpy(path,p); printf("%s ",path); if(access(path,F_OK) != 0) { erro = mkdir(path ,0777); if(erro == -1) { perror("mkdir"); return -1; } } while(1) { p = strtok(NULL,"/"); if(p == NULL) { break ; } sprintf(path,"%s/%s",path,p); printf("%s ",path); if(access(path,F_OK) == 0) { //存在这个目录,不需要创建。 } else { erro = mkdir(path ,0777); if(erro == -1) { perror("mkdir"); return -1; } } } return 0; } ls的实现 #include <sys/types.h> #include <dirent.h> #include <stdio.h> int main(int argc,char *argv[]) { DIR *dir = opendir(argv[1]); if(NULL == dir) { perror("opendir"); return ; } //使用路径打开文件。 while(1) { struct dirent * str_dir = readdir(dir); if(NULL == str_dir) { break; } if(strcmp(".",str_dir->d_name) == 0 || 0 == strcmp("..",str_dir->d_name)) { break; } printf("%s ",str_dir->d_name); } return 0; } 拷贝目录 #include <stdio.h> #include <sys/types.h> #include <dirent.h>//opendir的头文件 //readdir的头文件 #include <sys/stat.h> #include <fcntl.h> //open需要的头文件 #include <string.h> #include <errno.h> //errno的头文件 #include <stdlib.h> #include <unistd.h> //close的头文件 int main(int argc,char *argv[]) { //打印一个文件夹下的各种文件。 /* DIR * folder = opendir(argv[1]); if(NULL == folder) { perror("open"); return -1; } while(1) { struct dirent * dir = readdir(folder); if(NULL == dir) { break; } printf("%s ",dir->d_name); } */ if(access(argv[2],F_OK) == -1) { mkdir(argv[2],0777); } //如果文件不存在,就创建一个文件。 swap(argv[1],argv[2]); return 0; } int swap(char * source,char *destination) { DIR * sourDir = opendir(source); if(source == NULL) { perror("openDir"); return -1; } //遍历目录,如果发现是普通文件就直接复制,目录文件就递归调用 while(1) { struct dirent *dir = readdir(sourDir); if(NULL == dir) { break; } /* if( 0 == strncmp(dir->d_name,".",1)) { continue; } */ if(DT_DIR == dir->d_type) { //去除..和. if(strcmp(dir->d_name,"..") == 0 || strcmp(dir->d_name,".") == 0) { //printf("%s ",dir->d_name); continue; } char sourceDir[256] = {'