码迷,mamicode.com
首页 > 其他好文 > 详细

目录操作

时间:2015-06-24 16:07:29      阅读:123      评论:0      收藏:0      [点我收藏+]

标签:

转自  http://blog.csdn.net/todd911/article/details/12749765

1.mkdir函数

使用mkdir函数创建目录。

 

[cpp] view plaincopy
 
  1. #include <sys/stat.h>  
  2. int mkdir(const char* pathname, mode_t mode);  

 

如果成功返回0,失败返回-1.

此函数创建一个新的空目录,其中.和..目录是自动创建的,所指定的访问权限由mode指定。目录至少设置一个执行权限。

实践:

 

[cpp] view plaincopy
 
  1. #include <stdio.h>  
  2. #include <fcntl.h>  
  3. #include <sys/stat.h>  
  4.   
  5. int main(void){  
  6.         if(mkdir("mkdirtest",S_IRUSR|S_IWUSR|S_IXUSR)<0){  
  7.                 perror("mkdir");  
  8.                 return -1;  
  9.         }  
  10.         return 0;  
  11. }  

运行结果:

 

yan@yan-vm:~/apue$./a.out
yan@yan-vm:~/apue$ ll
drwxrwxr-x  4 yan       yan       4096 Jul 10 13:25 ./
drwx---rwx 25 yan       yan       4096 Jul 10 13:25 ../
drwx------  2 yan       yan       4096 Jul 10 13:25 mkdirtest/

 

2.rmkdir函数

使用rmdir函数可以删除一个空目录,空目录只包含.和..这两项目录。

 

[cpp] view plaincopy
 
  1. #include <unistd.h>  
  2. int rmdir(const char* pathname);  

 

如果成功则返回0,如果出错返回-1.

实践:

 

[cpp] view plaincopy
 
  1. #include <stdio.h>  
  2. #include <unistd.h>  
  3.   
  4. int main(void){  
  5.         if(rmdir("mkdirtest")<0){  
  6.                 perror("rmdir");  
  7.                 return -1;  
  8.         }  
  9.         return 0;  
  10. }  

运行结果:

 

yan@yan-vm:~/apue$ ll mkdirtest/
total 8
drwxrwxr-x 2 yan yan 4096 Jul 10 13:37 ./
drwxrwxr-x 4 yan yan 4096 Jul 10 13:37 ../
yan@yan-vm:~/apue$ ./a.out
yan@yan-vm:~/apue$ ll mkdirtest
ls: cannot access mkdirtest: No such file or directory

如果目录内容不为空,会怎么样?

yan@yan-vm:~/apue$ ll mkdirtest/
total 8
drwxrwxr-x 2 yan yan 4096 Jul 10 13:38 ./
drwxrwxr-x 4 yan yan 4096 Jul 10 13:38 ../
-rw-rw-r-- 1 yan yan    0 Jul 10 13:38 a
yan@yan-vm:~/apue$ ./a.out
rmdir: Directory not empty

删除会出错。

 

3.读取目录信息

通过以下函数可以读取目录的信息。

[cpp] view plaincopy
 
  1. #include <dirent.h>  
  2. DIR *opendir(const char* pathname); //如果成功返回指针,出错则返回NULL。  
  3. struct dirent* readdir(DIR* dp); //如果成功返回指针,若在目录结果或者出错则返回NULL。  
  4. void rewinddir(DIR* dp); //用来设置参数dir 目录流目前的读取位置为原来开头的读取位置。  
  5. int closedir(DIR* dp); //如果成功则返回0,出错则返回-1。  
  6. long telldir(DIR* dp); //返回dp关联的目录中的当前位置。  
  7. void seekdir(DIR* dp, long loc); //用来设置参数dir目录流目前的读取位置。  

 

其中dirent的结构如下:

 

[cpp] view plaincopy
 
  1. struct dirent{  
  2.     int_t d_ino; //i_node number;  
  3.     char d_name[NAME_MAX+1];  
  4. }  

 

 

实践:

 

[cpp] view plaincopy
 
  1. #include <stdio.h>  
  2. #include <dirent.h>  
  3.   
  4. int main(int argc, char* argv[]){  
  5.         int result = 0;  
  6.         DIR* dir = NULL;  
  7.         struct dirent* ptr;  
  8.   
  9.         if(argc != 2){  
  10.                 printf("parameter error.\n");  
  11.                 result = -1;  
  12.                 goto FINALLY;  
  13.         }  
  14.   
  15.         if((dir = opendir(argv[1])) == NULL){  
  16.                 perror("opendir");  
  17.                 result = -1;  
  18.                 goto FINALLY;  
  19.         }  
  20.   
  21.         while((ptr = readdir(dir)) != NULL){  
  22.                 printf("d_name:%s\n",ptr->d_name);  
  23.         }  
  24.   
  25.         rewinddir(dir);  
  26.   
  27.         printf("readdir again.\n");  
  28.         while((ptr = readdir(dir)) != NULL){  
  29.                 printf("d_name:%s\n",ptr->d_name);  
  30.         }  
  31. FINALLY:  
  32.         if(dir != NULL){  
  33.                 closedir(dir);  
  34.         }  
  35.         return result;  
  36. }  

运行结果:

 

yan@yan-vm:~/apue$ ll dirtest/
total 8
drwxrwxr-x 2 yan yan 4096 Jul 10 14:00 ./
drwxrwxr-x 4 yan yan 4096 Jul 10 14:22 ../
-rw-rw-r-- 1 yan yan    0 Jul 10 13:59 12345
-rw-rw-r-- 1 yan yan    0 Jul 10 14:00 67890
-rw-rw-r-- 1 yan yan    0 Jul 10 13:59 abc
-rw-rw-r-- 1 yan yan    0 Jul 10 13:59 def
-rw-rw-r-- 1 yan yan    0 Jul 10 13:59 ghi
yan@yan-vm:~/apue$ ./a.out dirtest/
d_name:..
d_name:ghi
d_name:abc
d_name:12345
d_name:def
d_name:67890
d_name:.
readdir again.
d_name:..
d_name:ghi
d_name:abc
d_name:12345
d_name:def
d_name:67890
d_name:.

 

 

[cpp] view plaincopy
 
  1. #include <stdio.h>  
  2. #include <dirent.h>  
  3.   
  4. int main(int argc, char* argv[]){  
  5.         int result = 0;  
  6.         DIR* dir = NULL;  
  7.         struct dirent* ptr;  
  8.         int offset;  
  9.   
  10.         if(argc != 2){  
  11.                 printf("parameter error.\n");  
  12.                 result = -1;  
  13.                 goto FINALLY;  
  14.         }  
  15.   
  16.         if((dir = opendir(argv[1])) == NULL){  
  17.                 perror("opendir");  
  18.                 result = -1;  
  19.                 goto FINALLY;  
  20.         }  
  21.   
  22.         offset = telldir(dir);  
  23.   
  24.         while((ptr = readdir(dir)) != NULL){  
  25.                 printf("d_name:%s\n",ptr->d_name);  
  26.         }  
  27.   
  28.         seekdir(dir, offset);  
  29.   
  30.         printf("readdir again.\n");  
  31.         while((ptr = readdir(dir)) != NULL){  
  32.                 printf("d_name:%s\n",ptr->d_name);  
  33.         }  
  34. FINALLY:  
  35.         if(dir != NULL){  
  36.                 closedir(dir);  
  37.         }  
  38.         return result;  
  39. }  

运行结果:

 

yan@yan-vm:~/apue$ ll dirtest/
total 8
drwxrwxr-x 2 yan yan 4096 Jul 10 14:00 ./
drwxrwxr-x 4 yan yan 4096 Jul 10 14:25 ../
-rw-rw-r-- 1 yan yan    0 Jul 10 13:59 12345
-rw-rw-r-- 1 yan yan    0 Jul 10 14:00 67890
-rw-rw-r-- 1 yan yan    0 Jul 10 13:59 abc
-rw-rw-r-- 1 yan yan    0 Jul 10 13:59 def
-rw-rw-r-- 1 yan yan    0 Jul 10 13:59 ghi
yan@yan-vm:~/apue$ ./a.out dirtest/
d_name:..
d_name:ghi
d_name:abc
d_name:12345
d_name:def
d_name:67890
d_name:.
readdir again.
d_name:..
d_name:ghi
d_name:abc
d_name:12345
d_name:def
d_name:67890
d_name:.

 

4.chdir、fchdir和getcwd函数

每个进程都有一个当前工作目录,此目录是搜索所有相对路径的起点,进程通过调用chdir和fchdir函数可以更改当前工作目录:
[cpp] view plaincopy
 
  1. #include <unistd.h>  
  2. int chdir(const char* pathname);  
  3. int fchdir(int filedes);  
如果成功则返回0,出错则返回-1.
 

使用getcwd函数获取进程当前工作目录的绝对路径。

 

[cpp] view plaincopy
 
  1. #include <unistd.h>  
  2. char* getcwd(char* buf, size_t size);  

 

如果成功返回buf,失败则返回NULL。

 

实践:

 

[cpp] view plaincopy
 
  1. #include <stdio.h>  
  2. #include <unistd.h>  
  3.   
  4. int main(void){  
  5.         char path[256];  
  6.   
  7.         printf("path:%s\n",getcwd(path,256));  
  8.         if(chdir("/tmp") < 0){  
  9.                 perror("chdir");  
  10.                 return -1;  
  11.         }  
  12.         printf("path:%s\n",getcwd(path,256));  
  13.         return 0;  
  14. }  

运行结果:
yan@yan-vm:~/apue$ pwd
/home/yan/apue
yan@yan-vm:~/apue$ ./a.out
path:/home/yan/apue
path:/tmp
yan@yan-vm:~/apue$ pwd
/home/yan/apue

 

可见,执行程序后,shell的当前目录没有改变,其原因是shell创建一个子进程,由该子进程具体执行程序,由此可见,为了改变

shell进程自己的目录,shell应该直接调用chdir,所以cd命令是直接包含在shell程序中的

目录操作

标签:

原文地址:http://www.cnblogs.com/QingCHOW/p/4597796.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!