2009-07-14 96 views
3

我在C++中開玩笑。 有什麼方法可以知道目錄是否包含子目錄?有沒有什麼方法可以知道目錄是否包含子目錄?

CFileFind似乎必須搜索整個文件。 如果唯一的子目錄位於列表的末尾並且有很多文件,那麼這很耗時。

例如:目錄A包含99995個文件和一個在FindNextFile列表末尾的子目錄。我試過99995次,然後說:是的,它包含子目錄?

回答

0

這是否可以做得非常快,完全取決於平臺。

在Win32上,您可以使用FindFirstFile/FindNextFile或MFC CFileFind之類的包裝器,並且它們以某種順序列出項目,但不能強制先列出目錄。

+0

說,99995個文件和一個子目錄螞蟻結束FindNextFile列表。我試過99995次,然後說:是的,它包含子目錄? – user25749 2009-07-14 06:50:43

+0

Yeap,這是在Win32上列出目錄內容的唯一方法。這就是爲什麼在資源管理器中打開包含許多文件的文件夾需要很多時間。 – sharptooth 2009-07-14 06:53:00

1

如果您使用.Net框架,您可以使用Directory.GetDirectories,並檢查數組的大小是否。不知道如果這會給你速度。

如果您可以控制目錄,則可以應用命名約定,以便具有子目錄的目錄被命名爲一種方式,而具有子目錄的目錄命名爲另一個目錄。

1

您可以嘗試使用boost文件系統庫。

一個名爲directory_iterator的類[在boost/filesystem/operations.hpp中聲明]有許多函數可用於列表文件,查找該文件是否是子目錄(is_directory - 我想這就是你正在尋找)等。

請參閱以下鏈接瞭解更多信息。 link text

看來你正在使用MFC [剛纔看到你使用的是CFileFind],之前沒有看到。 對不起,沒有太多的信息。您可能必須使用FindFirstFile/FindNextFile。

2

微軟的Raymond Chen寫了一篇文章,可能適用於:Computing the size of a directory is more than just adding file sizes。實際上,他解釋說像dir的大小這樣的信息不能存儲在dir的條目中,因爲不同的用戶可能具有不同的權限,可能使某些文件對他們不可見。因此,獲取用戶應該看到的大小的唯一方法是根據用戶的請求進行計算。

就你而言,答案可能源於相同的推理。應用程序可用的目錄列表只有在您的應用程序請求時才能確定,因爲其根目錄的視圖可能與另一個應用程序的視圖不同,它們使用不同的憑據運行。爲什麼Windows將目錄與我不知道的文件一起存儲,但這是給定的。

由於Win32儘可能接近用戶模式下的文件系統,因此我會避免使用.NET等更高級別的解決方案,因爲它可能只會簡化界面。司機可能會更快,但超出了我的知識範圍。

相關問題