《UNIX环境高级编程》笔记--目录操作
来源:互联网 发布:vb sleep 编辑:程序博客网 时间:2024/05/17 02:58
1.mkdir函数
使用mkdir函数创建目录。
#include <sys/stat.h>int mkdir(const char* pathname, mode_t mode);
如果成功返回0,失败返回-1.
此函数创建一个新的空目录,其中.和..目录是自动创建的,所指定的访问权限由mode指定。目录至少设置一个执行权限。
实践:
#include <stdio.h>#include <fcntl.h>#include <sys/stat.h>int main(void){ if(mkdir("mkdirtest",S_IRUSR|S_IWUSR|S_IXUSR)<0){ perror("mkdir"); return -1; } return 0;}运行结果:
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函数可以删除一个空目录,空目录只包含.和..这两项目录。
#include <unistd.h>int rmdir(const char* pathname);
如果成功则返回0,如果出错返回-1.
实践:
#include <stdio.h>#include <unistd.h>int main(void){ if(rmdir("mkdirtest")<0){ perror("rmdir"); return -1; } return 0;}运行结果:
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.读取目录信息
通过以下函数可以读取目录的信息。
#include <dirent.h>DIR *opendir(const char* pathname); //如果成功返回指针,出错则返回NULL。struct dirent* readdir(DIR* dp); //如果成功返回指针,若在目录结果或者出错则返回NULL。void rewinddir(DIR* dp); //用来设置参数dir 目录流目前的读取位置为原来开头的读取位置。int closedir(DIR* dp); //如果成功则返回0,出错则返回-1。long telldir(DIR* dp); //返回dp关联的目录中的当前位置。void seekdir(DIR* dp, long loc); //用来设置参数dir目录流目前的读取位置。
其中dirent的结构如下:
struct dirent{int_t d_ino; //i_node number;char d_name[NAME_MAX+1];}
#include <stdio.h>#include <dirent.h>int main(int argc, char* argv[]){ int result = 0; DIR* dir = NULL; struct dirent* ptr; if(argc != 2){ printf("parameter error.\n"); result = -1; goto FINALLY; } if((dir = opendir(argv[1])) == NULL){ perror("opendir"); result = -1; goto FINALLY; } while((ptr = readdir(dir)) != NULL){ printf("d_name:%s\n",ptr->d_name); } rewinddir(dir); printf("readdir again.\n"); while((ptr = readdir(dir)) != NULL){ printf("d_name:%s\n",ptr->d_name); }FINALLY: if(dir != NULL){ closedir(dir); } return result;}运行结果:
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:.
#include <stdio.h>#include <dirent.h>int main(int argc, char* argv[]){ int result = 0; DIR* dir = NULL; struct dirent* ptr; int offset; if(argc != 2){ printf("parameter error.\n"); result = -1; goto FINALLY; } if((dir = opendir(argv[1])) == NULL){ perror("opendir"); result = -1; goto FINALLY; } offset = telldir(dir); while((ptr = readdir(dir)) != NULL){ printf("d_name:%s\n",ptr->d_name); } seekdir(dir, offset); printf("readdir again.\n"); while((ptr = readdir(dir)) != NULL){ printf("d_name:%s\n",ptr->d_name); }FINALLY: if(dir != NULL){ closedir(dir); } return result;}运行结果:
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函数
#include <unistd.h>int chdir(const char* pathname);int fchdir(int filedes);
使用getcwd函数获取进程当前工作目录的绝对路径。
#include <unistd.h>char* getcwd(char* buf, size_t size);
如果成功返回buf,失败则返回NULL。
实践:
#include <stdio.h>#include <unistd.h>int main(void){ char path[256]; printf("path:%s\n",getcwd(path,256)); if(chdir("/tmp") < 0){ perror("chdir"); return -1; } printf("path:%s\n",getcwd(path,256)); return 0;}运行结果:
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程序中的。
- 《UNIX环境高级编程》笔记--目录操作
- 《Unix环境高级编程》学习笔记--文件和目录-1
- 《 Unix环境高级编程 》笔记
- 《 Unix环境高级编程 》笔记
- 《 Unix环境高级编程 》笔记
- Unix环境高级编程 笔记
- Unix环境高级编程笔记
- unix环境编程 目录操作
- unix环境高级编程笔记--高级IO
- unix环境高级编程-4.21-读目录
- 《unix环境高级编程》 读书笔记 目录
- unix环境高级编程-文件和目录
- 《unix高级环境编程》文件和目录——目录操作
- 《unix高级环境编程》文件和目录——目录操作
- unix环境高级编程-3.11-原子操作
- Unix 高级环境编程 关于原子操作
- unix环境高级编程学习1-unix文件和目录
- 《unix高级环境编程》文件和目录——文件操作
- RedHat linux 9.0虚拟机Vmware_Tools的安装方法
- git 例子
- mysql用sql查询时的错误
- glib-dbus 在ubuntu9.10 和 ubuntu10.04 上安装环境的搭建
- mysql错误:Error NO. 1130?如何解决?
- 《UNIX环境高级编程》笔记--目录操作
- 导库的问题与感想(随便看)
- Qt源码编译完成后,执行中出现undefined symbol: _ZN16QCoreApplicationC1ERiPPci错误解决方案
- ..\OBJ\ucgui_ucos.axf: Error: L6218E: Undefined symbol ff_convert (referred from ff.o). ..\OBJ\ucgui
- vc++遍历文件
- Eclipse 换皮肤
- SQL Server 2008 R2 使用 PIVOT 错误
- linux内核api参考手册
- Windows 8.1 TTS API