8.5實例--目錄列表

這一章非常亂,而且難以看懂,因為沒有UNIX系列系統(tǒng)的基本知識的話,有的東西很難明白,而書上對于這些知識的內(nèi)容只是一筆帶過.所以我感覺這章如果不打算用LINUX類似的系統(tǒng)的話,只要大概了解一下就好.看看代碼即可.不用深究.而我也不打算寫那么詳細(xì).如果想學(xué)LINUX系統(tǒng)可以去看看鳥哥的兩本.介紹的很詳細(xì).

UNIX系列系統(tǒng)的目錄就是一種文件,因此,ls(UNIX系列系統(tǒng)的一個命令行命令,顯示目錄的文件信息.)只需要讀此文件就可獲得所有的文件名,但是如果需要獲取文件的其他信息,比如長度等,就需要系統(tǒng)調(diào)用.在MS-DOS中獲取文件名也需要系統(tǒng)調(diào)用.

UNIX系列系統(tǒng)的文件系統(tǒng)結(jié)構(gòu),目錄就是文件,它包含了一個文件名列表和一些指示文件位置的信息."位置"是一個指向inode表的索引,而文件的inode是存放除文件名以及實際數(shù)據(jù)之外的所有信息.目錄項通常僅包含兩個條目,文件名和inode編號(就是inode表中的編號.每個文件都有一個編號,用以將一些散亂的用這些相同的編號組合在一起)

結(jié)構(gòu)Dirent包含inode編號和文件名.文件名的最大長度由NAME_MAX設(shè)定,NAME)MAX的值由系統(tǒng)決定.opendir返回一個指向稱為DIR的結(jié)構(gòu)的指針,該結(jié)構(gòu)與結(jié)構(gòu)FILE類似,它將被readdir和closedir使用.所有這些信息存放在頭文件dirent.h中.

那個inode節(jié)點的信息也可以百度一下.

先看一下代碼吧.

主函數(shù)
如果沒有參數(shù)只有程序名,那就處理當(dāng)前目錄.

調(diào)用fsize函數(shù)處理.那個"."就是當(dāng)前目錄的意思,如果我沒記錯".."兩個點就是上一級目錄的意思.

有參數(shù)的話就調(diào)用fsize處理依次處理這些參數(shù).(一次處理一個.處理一個后while判斷式判斷是否還有參數(shù),如果有那么繼續(xù)處理.)

fsize函數(shù)
聲明了stat類型的結(jié)構(gòu)stbuf.

系統(tǒng)調(diào)用stat將name,就是傳入?yún)?shù)的信息填充到結(jié)構(gòu)stbuf中.
出錯顯示錯誤信息.
并退出函數(shù).

如果沒出錯就判斷結(jié)構(gòu)體中的文件類型成員是不是目錄,是目錄就調(diào)用dirwalk函數(shù).
然后再輸出這個目錄的大小.

首先是看dirwalk函數(shù),因為readdir和opendir都跟具體的系統(tǒng)有關(guān).而這兩個函數(shù)在這里的功能只是傳回一個指針而已.所以沒什么大礙.

opendir返回一個DIR結(jié)構(gòu)的指針.(就是目錄.這個結(jié)構(gòu)里包含了目錄的文件描述符和一個direct類型的結(jié)構(gòu),direct類型的結(jié)構(gòu)包含了一個inode節(jié)點的編號,還有一個文件名.)

然后用readdir返回一個指向目錄中文件的結(jié)構(gòu)指針,這個指針包含了節(jié)點編號和文件名(因為read讀取的是目錄文件,而目錄文件中就包含了文件名.而這個書上這個版本的目錄結(jié)構(gòu)就這兩個成員.所以每次讀入也是這兩個成員.)

繼續(xù)向下看,看這個返回來的指針的名字也就是需要判斷的這個文件的名字是不是目錄本身或者是父目錄.是的話終止當(dāng)前循環(huán),執(zhí)行下一次循環(huán).

最后就是看目錄名字(dir)加上文件名字是否超出名字允許的最大字符.超出就報錯.

之后可以看一下opendir和readdir函數(shù)
opendir通過一系列的條件驗證是否是目錄.

以下任何一個出錯都將退出函數(shù)并返回錯誤狀態(tài).
首先用open函數(shù)打開這個文件并將文件描述符給fd,(open的第三個函數(shù)是創(chuàng)建文件時的權(quán)限.第二個參數(shù)中有一個可選參數(shù)是如果沒有找到該文件則創(chuàng)建該文件,而創(chuàng)建文件的權(quán)限就依據(jù)第三個參數(shù).)
然后用fstat函數(shù)(與stat功能相同,只不過依據(jù)的不是文件名而是文件描述符.)將fd的信息填充到結(jié)構(gòu)體stbuf中.
之后判斷剛才結(jié)構(gòu)中的文件類型成員是不是目錄.
最后用malloc分配空間,并返回DIR類型的結(jié)構(gòu)指針給dp.

如果都沒出錯,將這個目錄文件的文件描述符復(fù)制給杠桿分配空間后的DIR結(jié)構(gòu)體重的相應(yīng)成員.
最后將該結(jié)構(gòu)體的指針返回.

接著去看readdir函數(shù)

每次通過read函數(shù)讀取目錄中的數(shù)據(jù),每次讀取dirbuf個長度的內(nèi)容,目錄中的每組數(shù)據(jù)都是dirbuf個長度的,所以每次都能讀到一組.然后是復(fù)制信息以便兼容.

這個最難想通的就是最后那個readdir函數(shù)通過read讀取目錄的內(nèi)容是怎么讀取的.

最后看了好幾遍書,知道了目錄文件都是這樣的結(jié)構(gòu),每次讀取都可以得到一組.

練習(xí)完全不用寫.就加了一個printf語句而已,

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末莺债,一起剝皮案震驚了整個濱河市靖诗,隨后出現(xiàn)的幾起案子哲嘲,更是在濱河造成了極大的恐慌锥忿,老刑警劉巖莱革,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件闽颇,死亡現(xiàn)場離奇詭異锻拘,居然都是意外死亡米母,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門矫钓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來要尔,“玉大人,你說我怎么就攤上這事新娜≌栽” “怎么了?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵概龄,是天一觀的道長还惠。 經(jīng)常有香客問我,道長私杜,這世上最難降的妖魔是什么蚕键? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮歪今,結(jié)果婚禮上嚎幸,老公的妹妹穿的比我還像新娘颜矿。我一直安慰自己寄猩,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布骑疆。 她就那樣靜靜地躺著田篇,像睡著了一般。 火紅的嫁衣襯著肌膚如雪箍铭。 梳的紋絲不亂的頭發(fā)上泊柬,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天,我揣著相機與錄音诈火,去河邊找鬼兽赁。 笑死,一個胖子當(dāng)著我的面吹牛冷守,可吹牛的內(nèi)容都是我干的刀崖。 我是一名探鬼主播,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼拍摇,長吁一口氣:“原來是場噩夢啊……” “哼亮钦!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起充活,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蜂莉,失蹤者是張志新(化名)和其女友劉穎蜡娶,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體映穗,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡窖张,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了蚁滋。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片荤堪。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖枢赔,靈堂內(nèi)的尸體忽然破棺而出澄阳,到底是詐尸還是另有隱情,我是刑警寧澤踏拜,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布碎赢,位于F島的核電站,受9級特大地震影響速梗,放射性物質(zhì)發(fā)生泄漏肮塞。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一姻锁、第九天 我趴在偏房一處隱蔽的房頂上張望枕赵。 院中可真熱鬧,春花似錦位隶、人聲如沸拷窜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽篮昧。三九已至,卻和暖如春笋妥,著一層夾襖步出監(jiān)牢的瞬間懊昨,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工春宣, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留酵颁,地道東北人。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓月帝,卻偏偏與公主長得像躏惋,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子嫁赏,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,060評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)載自:http://blog.csdn.net/hguisu/article/details/6122513原作...
    miaoiao閱讀 1,518評論 0 7
  • Linux系統(tǒng)一般有4個主要部分: 內(nèi)核其掂、shell、文件系統(tǒng)和應(yīng)用程序潦蝇。內(nèi)核款熬、shell和文件系統(tǒng)一起形成了基本...
    偷風(fēng)箏的人_閱讀 3,257評論 1 17
  • 三年了深寥! 1095天了 我是多么的想念當(dāng)年的你和我,我是多么的想念當(dāng)年和你的那些事兒贤牛,我是多么的想念和你一起談心惋鹅,...
    Pink霏兒閱讀 182評論 1 1
  • 一直想做一件自己想要去做的事情闰集,就是安靜地當(dāng)生活的記錄員,記錄那些我想跟大家分享的事情般卑,記錄那些發(fā)自內(nèi)心的...
    大笨鐘的閑暇時光閱讀 377評論 7 7
  • 青春的歲月里蝠检,總有一人沐鼠,讓你知道世界上還有一人和你有著同樣的心事,同樣的感受叹谁,你曾一度認(rèn)為他很懂你饲梭,其實他不是懂你...
    大喵彌彌閱讀 597評論 0 0