修改当前进程的路径
int chdir(const char *path);
获取当前进程工作目录
char *getcwd(char *buf, size_t size);
chdir()函数与getcwd()函数结合在一起使用理解
// chdir_getcwd.c #include <stdio.h> #include <fcntl.h> #include <sys/types.h> #include <sys/stat.h> #include <stdlib.h> #include <unistd.h> int main(int argc, char* argv[]) { if(argc < 2) { printf("a.out dir\n"); exit(1); } int ret = chdir(argv[1]); if(ret == -1) { perror("chdir"); exit(1); } int fd = open("chdir.txt", O_CREAT | O_RDWR, 0777); if(fd == -1) { perror("open"); exit(1); } close(fd); char buf[128]; getcwd(buf, sizeof(buf)); printf("current dir: %s\n", buf); return 0; }
创建目录 - -注意:创建的目录需要有执行权限,否则无法进入目录
int mkdir(const char *pathname, mode_t mode);
// mkdir.c #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> int main(int argc, char* argv[]) { if(argc < 3) { printf("a.out newDir mode\n"); exit(1); } int mode = strtol(argv[2], NULL, 8); int ret = mkdir(argv[1], mode); if(ret == -1) { perror("mkdir"); exit(1); } return 0; }
删除一个空目录
int rmdir(const char *pathname);
打开一个目录
DIR *opendir(const char *name);
返回值:DIR结构指针,该结构是一个内部结构,保存所打开的目录信息,作用类似于FILE结构,函数出错返回NULL
读取目录
struct dirent *readdir(DIR *dirp);
返回一条记录项:
struct dirent { ino_t d_ino; // 此目录进入点的inode off_t d_off; // 目录文件开头至此目录进入点的位移 unsigned short int d_reclen; // 文件的长度, 不包含NULL字符 unsigned char d_type; // 所指的文件类型 char d_name[256]; // 以NULL结尾的文件名 };
d_type: DT_BLK-块设备 DT_CHR-字符设备 DT_DIR-目录 DT_LNK-软连接 DT_FIFO-管道 DT_REG-普通文件 DT_SOCK-套接字 DT_UNKNOWN-未知
关闭目录
int closedir(DIR *dirp);
// opendir_readdir_closedir.c #include <string.h> #include <stdio.h> #include <stdlib.h> #include <dirent.h> int getFileNum(char* root) { // 打开目录 DIR* dir = opendir(root); if(dir == NULL) { perror("opendir"); exit(0); } // 读目录 int total = 0; char path[1024] = {0}; struct dirent* ptr = NULL; while((ptr = readdir(dir)) != NULL) { // 跳过 . 和 .. if(strcmp(ptr->d_name, ".") == 0 || strcmp(ptr->d_name, "..") == 0) { continue; } // 判断是不是文件 if(ptr->d_type == DT_REG) { total ++; } // 如果是目录 if(ptr->d_type == DT_DIR) { // 递归读目录 sprintf(path, "%s/%s", root, ptr->d_name); total += getFileNum(path); } } closedir(dir); return total; } int main(int argc, char* argv[]) { // 读目录, 统计文件个数 int total = getFileNum(argv[1]); // 打印 printf("%s has file number: %d\n", argv[1], total); return 0; }
参考黑马程序员linux系统编程资料