2013-01-10 27 views
1

我有一些現有的Java代碼,使用java.nio.file.Files.walkFileTreeFileVisitor接口,但現在我需要將它移植到普通C.是否存在此接口的C等效?如果不是,我可以使用什麼原語來創建一個?將Java NIO Files.walkFileTree訪問移植到C,維護線程安全

我已經看過了Unix的ftwnftw功能,但它不會出現,他們將工作,因爲回調函數沒有參數,用於提供用戶變量(一個無效* PARAM本來不錯)。我的代碼需要線程安全。

+0

刪除'[java]'標記作爲答案與Java沒有任何關係。 –

+0

如果一切都失敗了,你可以以線程安全的方式使用'ftw'。將用戶數據指針存儲在線程局部存儲中,或者使用C11中的_Thread_local或pthread_setspecific()來存儲。你不能輕易做的就是讓這樣的接口重入。 –

+0

在相關說明中,我還發現了這個不錯的[鏈接](http://rosettacode.org/wiki/Walk_a_directory/Recursively),它展示瞭如何在幾乎所有語言中執行遞歸文件樹遍歷。 –

回答

1

我已經有這個需要爲我的項目之一的文件散步。我也需要它可以在Linux和Windows上移植。

我沒有找到它的開源實現,最後終於自己實現了。這終究不是太多工作。

在Linux方面,我用opendir()readdir()迭代目錄條目。
在Windows端,我使用FindFirstFileA()FindNextFileA()來完成這項工作。
接下來對於每個條目,我只需調用一個已定義的回調函數。

這兩種實現都不會花費100多行代碼......所以我建議你自己動手。

+0

這基本上是我最終做的。謝謝。 –

-1

如果在C++中進行混合是可以接受的,那麼這樣做有助於提升,但從未使用它。

1

BSD操作系統和Linux都提供了一個名爲fts(3)的函數族,它與POSIX ftw的功能相同,但沒有通過回調控制的反轉。相反,範式是你「開放」的FS層次結構,以獲得一個句柄,然後在「讀」的條目出的是:

char *const roots[] = {root, NULL}; // fts allows for multiple roots 
FTS *hier = fts_open(roots, FTS_PHYSICAL | FTS_NOSTAT, NULL); 
FTSENT *entry; 

while ((entry = fts_read(hier)) != NULL) { 
    puts(entry->fts_path); 
} 
fts_close(hier); 

恕我直言,這是比訪問者模式更清潔,但對於一個直接端口你的Java代碼當然可以在fts(3)之上實現。

如果您的操作系統沒有fts(3),請查看OpenBSD version of fts.c,您應該可以通過最小的修改將其粘貼到您的程序中。您還需要標題fts.h

+0

這也是有用的信息。我沒有選擇這個答案的唯一原因是因爲我最終實際執行了@greydet的答案 –