今天,我们来学习Unix操作系统环境高级程序设计入门知识,关于目录部分的知识。这部分是Unix操作系统环境高级程序设计的基础知识,希望大家可以好好的学习。
不管是何种操作系统,一提到其中的文件系统首先想到的自然是目录和文件。在Unix操作系统中一切皆可视为文件,目录是一种特殊的文件。
在已发表的《Unix操作系统的入门与基础》一文中,曾介绍过用户主目录、工作目录以及绝对路径、相对路径的概念,我们也已经知道了使用pwd命令可以获得当前工作目录的绝对路径,那么如何在程序中实现类似于pwd命令的功能呢?这里需要用到getcwd()函数,它的定义是:
- #include <unistd.h>
- char* getcwd(char* buf, size_t size); //成功返回buf,失败返回NULL
此函数中的***个参数buf数组用于存放当前工作目录路径名的字符串,size是指这个buf数组最多能装多少数据,而函数返回值与放入buf中的内容是相同的。要注意的是,Unix操作系统该缓存必须有足够的长度以容纳绝对路径名再加上一个“/0”终止字符,否则将会返回出错。
对于Unix操作系统目录的操作,最常见的就是打开目录、读取目录信息、关闭目录,与之对应的函数分别是:
- #include <sys/types.h>
- #include <dirent.h>
- DIR* opendir(const char* dirname); //成功时返回指针,失败返回NULL
- struct dirent* readdir(DIR* dirp); //成功时返回指针,失败返回NULL
- int closedir(DIR* dirp); //成功时返回0,失败返回-1
使用opendir()函数打开不存在的目录或者对目录没有访问权限,以及对普通文件使用此函数都将返回NULL。opendir()函数成功操作后将返回指向DIR结构的指针,而Unix操作系统DIR结构用来保存被读取目录的相关信息。定义在头文件<dirent.h>中的dirent结构最常用到的成员是d_name,它可以保存文件名。
现来看下面的一个例程序:
[程序1]
- #include <iostream>
- #include <unistd.h>
- #include <sys/types.h>
- #include <dirent.h>
- #include <errno.h>
- using namespace std;
- int main()
- {
- DIR* dp;
- cout << " Please enter a dir name: ";
- char name[255];
- memset(name,0x00,255);
- cin >> name;
- cout << " ----------------- " << endl;
- dp = opendir(name);
- if(dp == NULL)
- {cout << errno << " [" <<strerror(errno) << "]" << endl;
- return -1;}
- dirent* dirp;
- while((dirp = readdir(dp))!= NULL)
- {cout << dirp->d_name << endl;}
- closedir(dp);
- return 0;}
在Unix操作系统中,一旦出现程序执行失败的情况,系统会自动设置一个名为errno的全局变量,用于记录错误的出错ID号。使用strerror(errno)可以获得指定错误的描述信息,不过在此之前一定要包含errno.h的头文件。
编译执行程序1时,如果输入一个已存在且有访问权限的目录名,程序会列出此目录下的所有子目录名以及文件名;如果输入的是一个文件名,则会输出20 [Not a directory];如果输入的是一个不存在的目录名,则会输出2 [No such file or directory]。
以上,我们就对Unix操作系统环境高级程序设计目录部分的知识学习完了,希望大家可以哈哈的巩固基础知识。
【编辑推荐】