十五、文件和目录——目录操作函数

15.1 目录操作函数

15.1.1 创建目录

1 #include <sys/types.h>  
2 #include <sys/stat.h>  
3 int mkdir(const char *pathname, mode_t mode)
  • 函数说明:
    • 该函数创建一个名为pathname的空目录,此目录自动含有 “.” 和 “..” 2 个登记项。这个新创建目录的用户 ID 被设置为调用进程的有效用户 ID,其组则为父目录的组 ID 或者进程的有效组 ID
    • 若调用成功,mkdir 将更新该目录的 st_atime、st_ctime 和 st_mtime,同时更新其父目录的 st_ctime 和 st_mtime ,然后返回 0 。若调用失败,mkdir 将返回-1.
    • 由 pathname指定的新目录的父目录必须存在,并且调用进程必须具有该父目录的写权限以及 pathname 涉及的各个分路径目录的搜寻权限
    • 创建目录时,至少指定一个执行权限位
  • 函数功能:创建目录
  • 函数参数:
    • @pathname : 新创建目录的目录名
    • @mode:指定该目录的访问权限,这些位将受到文件创建方式(umask)的修正
  • 返回值:成功返回0,失败返回 -1

15.1.2 删除目录

1 #include<unistd.h>
2 int rmdir(const char *pathname);
  • 函数功能:
    • 删除一个空目录
    • 使用 rmdir 函数时候,目录必须为空或该目录的链接计数为2(只包含 . 和 ..),且无其他进程打开此目录,否则调用失败
  • 返回值:
    • 成功返回 0,失败返回 -1   

15.1.3 打开目录

1 #include <sys/types.h>
2 #include <dirent.h>
3 DIR *opendir(const char *pathname);
  • 函数功能:打开目录
  • 返回值:成功返回目录指针,出错返回  NULL

15.1.4 读取目录

1 #include <sys/types.h>
2 #include <dirent.h>
3 struct dirent *readdir(DIR *dp);
  • 函数功能:读取目录
  • 返回值:成功返回指针,若在目录结尾或者出错,返回 NULL

15.1.5 重定位目录

1 #include <sys/types.h>
2 #include <dirent.h>
3 void rewinddir(dir(DIR *dp));
  • 函数功能:重新定位从头开始读取
  • 返回值:成功返回 0,出错返回 -1

15.1.6 关闭目录

1 #include <sys/types.h>
2 #include <dirent.h>
3 int closedir(DIR *dp)
  • 函数功能:关闭目录
  • 返回值:成功返回 0,出错返回 -1

15.1.7 dirent 结构体

1 struct dirent {
2     ino_t d_ino;       /* i-node number */
3     char  d_name[NAME_MAX + 1];   /* null - terminated filename */      
4 }

15.1.8 指定新的当前工作目录

1 #include<unistd.h>
2 int chdir(const char *pathname);
3 int fchdir(int fd);
  • 函数功能:分别用 pathname 或 fd 来指定新的当前工作目录
  • 返回值:成功返回0,出错返回 -1
  • 函数说明:当前工作目录是一个进程的属性,所以它只影响调用 chdir 的进程本身,而不影响其他进程

15.1.9 获得当前工作目录的绝对路径名

1 #include<unistd.h>
2 char *getcwd(char *buf, size_t size);
  • 函数功能:获得当前工作目录的绝对路径名,getcwd()会将当前的工作目录绝对路径复制到参数buf所指的内存空间
  • 返回值:成功返回  buff,出错返回 NULL  

15.2 例子

15.2.1 读取一个目录

  dir_read.c

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <dirent.h>
 4 #include <string.h>
 5 #include <sys/stat.h>
 6 #include <errno.h>
 7 
 8 int main(int argc, char *argv[])
 9 {
10     if(argc < 2) {
11         fprintf(stderr, "usage: %s dir\n", argv[0]);
12         exit(1);
13     }
14 
15     struct stat buff;
16     if(lstat(argv[1], &buff) < 0) {
17         perror("lstat error");
18         exit(1);
19     }
20 
21     //判断是否是目录
22     if(!S_ISDIR(buff.st_mode)) {
23         fprintf(stderr, "%s is not a directory\n", argv[1]);
24         exit(1);
25     }
26 
27     // 打开目录
28     DIR *dir = opendir(argv[1]);
29     if(dir == NULL) {
30         fprintf(stderr, "%s open error\n", argv[1]);
31         exit(1);
32     }
33 
34     //读取目录内的信息
35     struct dirent *ent;
36      while((ent = readdir(dir)) != NULL) {
37          printf("%-20s %10ld\n", ent->d_name, ent->d_ino);
38      }
39 
40      closedir(dir);
41 }

 编译运行: 

  

15.2.2 切换目录

  mchdir.c

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <unistd.h>
 4 #include <fcntl.h>
 5 #include <string.h>
 6 #include <memory.h>
 7 
 8 int main(int argc, char *argv[])
 9 {
10     if(argc < 2) {
11         fprintf(stderr, "usage: %s\n", argv[0]);
12         exit(1);
13     }
14 
15     char buff[4096];
16     memset(buff, 0, sizeof(buff));
17     //获得当前工作目录
18     if(getcwd(buff, sizeof(buff)) != NULL) {
19         printf("current dir: %s\n", buff);
20     }
21 
22     //切换目录
23     if(chdir(argv[1]) < 0) {
24         perror("chdir error");
25         exit(1);
26     }
27 
28     memset(buff, 0, sizeof(buff));
29     if(getcwd(buff, sizeof(buff)) != NULL) {
30         printf("current dir: %s\n", buff);
31     }
32 
33     return 0;
34 }

  编译运行:

  

 

posted @ 2018-05-21 22:29  游戏进行中  阅读(256)  评论(0编辑  收藏  举报