1

有沒有一種更有效的方式來遍歷包含鏈接週期的目錄樹,而不是跟蹤哪些文件已被訪問?包含鏈接週期的有效方式遍歷目錄樹

例如,考慮走包含這些文件的目錄:

symlink "parent" -> ".." 
symlink "uh_oh" -> "/" 
regular file "reg" 
symlink "reg2" -> "reg" 
+0

使用readdir()時應該可能讀取目錄條目類型(d_type),這樣程序就可以確定它的符號鏈接或目錄或文件,並忽略/繼續查找。請參閱http://linux.die.net/man/3/readdir,這又取決於底層FS的實現。 – askb 2014-10-19 17:00:18

回答

0

你也應該追蹤已被訪問,按你的第一個例子目錄,但除此之外沒有更好的解決方案比保持訪問標誌爲每個文件。

如果有可移植的方式爲掛載的文件系統獲取簡短的唯一標識符,維護標誌將會更容易。即使這樣,您仍然需要考慮掃描過程中發生的mount和umount操作的後果,特別是如果文件系統樹包含遠程文件系統,則此掃描可能需要相當長的時間。

從理論上講,您可以從stafvfs接口獲得「文件系統ID」,但實際上這不是完全便攜的。從一個Linux發行版報價man statfs

沒有人知道什麼f_fsid應該包含…

......一般的想法是,f_fsid包含一些隨機的東西,使這對(f_fsid,ino)唯一確定一個文件。某些操作系統使用設備編號(或其變體),或將設備編號與文件系統類型結合使用。有幾個操作系統限制只向超級用戶發出f_fsid字段(並將其歸爲非特權用戶),因爲這個字段在NFS導出時被用在文件系統的文件句柄中,並且出於安全考慮。

這後一種限制 - 該f_fsid被呈現爲0到非特權用戶 - 不違反以上引用的POSIX標準,因爲該標準包括一個非常普遍disclaimer:「這是不確定是否所有成員statvfs結構在所有文件系統上都有有意義的值。「

+0

如果符號鏈接可以指向已經訪問過的常規文件,那麼跟蹤目錄是否會工作? – 2014-10-20 01:30:43

+0

@MattJoiner:取決於你是否在意兩次訪問文件:) – rici 2014-10-20 01:33:02

0

樹步行算法保證你會參觀每一個文件的目錄下,這樣反而跟蹤單個文件,你可以保持搜索的「根」的列表:

  • 初始目錄添加到列表的根
  • 走每個搜索根的目錄樹
  • 對於找到的每個符號鏈接,檢查它是否已被搜索根所包含。如果不是,請將其添加爲新的搜索根。

這樣您將訪問每個文件和目錄,永遠不會陷入循環,但可能會多次訪問文件和目錄。只有當你找到一個到現有根的祖先的符號鏈接時纔會發生這種情況。爲避免這樣做,您可以在輸入目錄之前檢查目錄是否爲搜索根目錄。