基礎(chǔ)學(xué)習(xí)Unix操作系統(tǒng)環(huán)境高級(jí)程序設(shè)計(jì)
今天,我們來(lái)學(xué)習(xí)Unix操作系統(tǒng)環(huán)境高級(jí)程序設(shè)計(jì)入門知識(shí),關(guān)于目錄部分的知識(shí)。這部分是Unix操作系統(tǒng)環(huán)境高級(jí)程序設(shè)計(jì)的基礎(chǔ)知識(shí),希望大家可以好好的學(xué)習(xí)。
不管是何種操作系統(tǒng),一提到其中的文件系統(tǒng)首先想到的自然是目錄和文件。在Unix操作系統(tǒng)中一切皆可視為文件,目錄是一種特殊的文件。
在已發(fā)表的《Unix操作系統(tǒng)的入門與基礎(chǔ)》一文中,曾介紹過(guò)用戶主目錄、工作目錄以及絕對(duì)路徑、相對(duì)路徑的概念,我們也已經(jīng)知道了使用pwd命令可以獲得當(dāng)前工作目錄的絕對(duì)路徑,那么如何在程序中實(shí)現(xiàn)類似于pwd命令的功能呢?這里需要用到getcwd()函數(shù),它的定義是:
- #include <unistd.h>
- char* getcwd(char* buf, size_t size); //成功返回buf,失敗返回NULL
此函數(shù)中的***個(gè)參數(shù)buf數(shù)組用于存放當(dāng)前工作目錄路徑名的字符串,size是指這個(gè)buf數(shù)組最多能裝多少數(shù)據(jù),而函數(shù)返回值與放入buf中的內(nèi)容是相同的。要注意的是,Unix操作系統(tǒng)該緩存必須有足夠的長(zhǎng)度以容納絕對(duì)路徑名再加上一個(gè)“/0”終止字符,否則將會(huì)返回出錯(cuò)。
對(duì)于Unix操作系統(tǒng)目錄的操作,最常見的就是打開目錄、讀取目錄信息、關(guān)閉目錄,與之對(duì)應(yīng)的函數(shù)分別是:
- #include <sys/types.h>
- #include <dirent.h>
- DIR* opendir(const char* dirname); //成功時(shí)返回指針,失敗返回NULL
- struct dirent* readdir(DIR* dirp); //成功時(shí)返回指針,失敗返回NULL
- int closedir(DIR* dirp); //成功時(shí)返回0,失敗返回-1
使用opendir()函數(shù)打開不存在的目錄或者對(duì)目錄沒有訪問(wèn)權(quán)限,以及對(duì)普通文件使用此函數(shù)都將返回NULL。opendir()函數(shù)成功操作后將返回指向DIR結(jié)構(gòu)的指針,而Unix操作系統(tǒng)DIR結(jié)構(gòu)用來(lái)保存被讀取目錄的相關(guān)信息。定義在頭文件<dirent.h>中的dirent結(jié)構(gòu)最常用到的成員是d_name,它可以保存文件名。
現(xiàn)來(lái)看下面的一個(gè)例程序:
[程序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操作系統(tǒng)中,一旦出現(xiàn)程序執(zhí)行失敗的情況,系統(tǒng)會(huì)自動(dòng)設(shè)置一個(gè)名為errno的全局變量,用于記錄錯(cuò)誤的出錯(cuò)ID號(hào)。使用strerror(errno)可以獲得指定錯(cuò)誤的描述信息,不過(guò)在此之前一定要包含errno.h的頭文件。
編譯執(zhí)行程序1時(shí),如果輸入一個(gè)已存在且有訪問(wèn)權(quán)限的目錄名,程序會(huì)列出此目錄下的所有子目錄名以及文件名;如果輸入的是一個(gè)文件名,則會(huì)輸出20 [Not a directory];如果輸入的是一個(gè)不存在的目錄名,則會(huì)輸出2 [No such file or directory]。
以上,我們就對(duì)Unix操作系統(tǒng)環(huán)境高級(jí)程序設(shè)計(jì)目錄部分的知識(shí)學(xué)習(xí)完了,希望大家可以哈哈的鞏固基礎(chǔ)知識(shí)。
【編輯推薦】