2014-04-12 67 views
2

我有一個包含〜15000個目錄(B1,B2,..,B15000)的目錄(我們稱之爲目錄A),B的每個目錄包含一個文件稱之爲「原始」),我想讀。 所以我想讀: A/B1 /生 A/B2 /生 ...dirent處理的文件/目錄的最大數目struct

我不知道B的目錄名提前,但我知道目錄A和它的名字每個B的目錄中都有一個名爲raw的文件。

因此,我使用dirent爲了打開A並移動它中的所有目錄 - 提取包含在d_name字段中的名稱,但在讀取264個目錄的名稱後停止運行!

我不知道結構dirent不能容納超過264個目錄嗎?誰能幫我 ?

謝謝先進。


[代碼從評論]

DIR* dRoot = opendir(argv[1]); 
assert(dRoot != NULL); 
struct dirent* dir; 

while((dir = readdir(dRoot))) 
{ 
    //suppose dirName is a string "argv[1]/dir->d_name/raw" 
    FILE* file = fopen(dirName,"r"); 

    //do something 

    fclose(file); 
} 

closedir(dRoot); 
+4

*您如何閱讀目錄?你能告訴我們一些代碼嗎?最好是[最小,完整和可驗證示例](http://stackoverflow.com/help/mcve)。 –

+0

DIR * dRoot = opendir(argv [1]); assert(dRoot!= NULL); struct dirent * dir; (dir = readdir(dRoot))){ //假設dirName是一個字符串「argv [1]/dir-> d_name/raw」 FILE * file = fopen(dirName,「r」); //做某事 fclose(file); } closedir(dRoot); 我看到的是,我走出了這個循環,雖然我沒有檢查所有依賴dRoot的目錄!好像「dir-> d_name」在目錄號264之後包含NULL! – user3527261

+0

我假設你檢查當前目錄和父目錄(名稱分別是'「。」'「和'」..「')?另外,該程序的參數是什麼('argv [1]')?你檢查文件是否正確打開(即'file'不是'NULL')?你檢查它是一個目錄而不是文件?你如何創建和初始化'dirName'? –

回答

2

readdir()struct dirent它返回一個指向分配內存。該dirent s的上closedir()自動釋放,所以你不能free()內存,當你不再需要任何特別dirent,並closedir()後,您不能使用任何dirent。我想這是可能的(儘管不太可能)你的程序不能爲dirent分配更多的內存。
您可以在readdir()返回NULL後查詢errno

如果是這樣的問題,您可以改用readdir_r(),它採用了dirent*爲您提供的分配(甚至可能是棧上的局部變量),之後才能重新使用它爲所有dirent S,一個另一個。 readdir_r()的一個注意事項是struct dirent的大小取決於文件系統,並且您需要確保您的分配足夠大。

相關問題