unix环境高级编程笔记(6)—— 文件和目录(3)
这一节主要是讲目录的操作,涉及创建目录、删除目录、读取目录等
1 mkdir 和 rmdir
用mkdir创建目录,用rmdir删除目录。
#include <sys/stat.h>
int mkdir(const char *pathname,mode_t mode);
成功返回0,出错返回-1.
此函数创建一个新的空目录,. 和.. 自动创建,文件访问权限mode由进程的文件模式创建屏蔽字进行修改。(必须指定一个执行权限位)
#include <unistd.h>
int rmdir(const char *pathname);
成功返回0,出错返回-1.
此函数删除一个空目录。如果函数使目录的链接计数为0,且没有进程打开此目录,则释放目录所占的空间。
2 读目录
对目录具有访问权限的任何用户都可以读目录,但是,只有内核才可以写目录。
#include <dirent.h>
DIR *opendir(const char *pathname);
成功返回指针,出错返回NULL。
struct dirent *readdir(DIR *dp);
成功返回指针,出错返回NULL。
void rewinddir(DIR *dp);
int closedir(DIR *dp);
成功返回0,出错返回NULL。
long telldir(DIR *dp);
返回值:与dp关联的目录中的当前位置。
void seekdir(DIR *dp,long loc);
dirent 结构在<dirent.h>中定义。
struct dirrent {
ino_t d_ino;
char d_name[NAME_MAX + 1];
};
DIR 是一个内部结构,上述六个函数用这个内部结构保存当前正在被读的目录的有关信息。
由opendir返回的指向DIR结构的指针供另外5个函数使用,opendir执行初始化操作,使第一个readdir读目录的第一个目录项。且各个目录项的顺序一般不按字母顺序排列。
3 chdir,fchdir 和 getcwd 函数
每个进程都有一个当前工作目录,此目录是搜索所有相对路径名的起点(不以斜杠开始的路径名为相对路径)。
#include <unistd.h>
int chdir (const char *pathname);
int fchdir (int filedes);
成功返回0.失败返回-1.
这两个函数中,分别用pathname和filedes来指定新的当前工作目录。
注意:当前工作目录是进程的一个属性,所以更改当前工作目录只影响调用进程本身。
#include <unistd.h>
char *getcwd (char *buf,size_t size);
若成功返回buf,失败返回NULL。
该缓冲区必须有足够的长度容纳绝对路径地址加上一个null终止字符。
实例:
#include <stdio.h> #include <unistd.h> int main() { char path[1024]; if(getcwd(path,1024) == NULL) printf("getcwd error\n"); else printf("before: %s\n",path); if(chdir("/home") != 0) printf("chdir error\n"); if(getcwd(path,1024) == NULL) printf("getcwd error\n"); else printf("after: %s\n",path); return 0; }
编译运行
root@debian:/program# pwd /program root@debian:/program# ./4-9 before: /program after: /home root@debian:/program# pwd /program root@debian:/program# ^C root@debian:/program#
从上面的结果可以看出,chdir只改变调用进程的当前工作目录,并不影响其他进程。getcwd 获取当前工作目录。
浙公网安备 33010602011771号