2011-09-01 19 views
3

我正在寫一個類的程序,我想知道一些代碼的輸出。我有一些像這樣的代碼:C中的「Double dot」目錄名?

DIR* dir = opendir("."); 
struct dirent* reader; 

while ((reader = readdir(dir)) != NULL) 
{ 
//print the name of the path found by reader. 
} 

現在這工作得很好,所有的,但我注意到,前兩個列表總是:

. 
.. 
//rest of files here 

現在我假設第一個點.簡直是當前目錄的名稱,但第二個雙點是什麼?我知道cd ..可以讓你進入文件層次結構,但我不知道爲什麼在讀取子目錄名稱時輸出。

我擔心的原因是因爲我想遞歸遍歷所有文件,但是如果我通過..,那裏的第一個目錄名稱是.,這會導致循環。那麼我該如何避免這種情況呢?

+1

它來自文件系統本身--C之外 – 2011-09-01 21:35:21

回答

6

..是父目錄。除非你在文件系統根目錄下,在這種情況下,它與根目錄相同。

基本上你想檢查你的dir變量是否等於...。如果是,則跳過該目錄。

你可以通過把該支票在while循環,或通過從目錄的陣列過濾掉這兩個目錄中實現這一目標。

哦,請確保您不小心跳過與.啓動目錄,因爲那些仍然有效目錄。確保整個目錄名稱是...

2

當降入目錄結構它限制遞歸是很重要的 - 只是忽略.(當前目錄)和..(父目錄)是不夠的(但可以肯定的避免了一些無用的旅行:-)。考慮一個符號鏈接文件,foo鏈接到. - 這將有如下.同樣的效果。

要麼保持的深度計或者「看到目錄」或結構(智能實現能夠檢測並剪枝週期)。也考慮使用readlink來檢查目標。 (注意:hardlinks to directories can be created in OS X這樣的readlink可以幫助,但不能忽略了對方後衛的需要。)

編碼愉快。