我nftw()用來做目錄遍歷。現在我只想列出指定目錄中的所有檔案,但似乎不管所有檔案夾下的什么。即使我指定FTW_PHYS.
唯一的解決方法是設定
if (ftwbuf->level > 1) {
return;
}
在被呼叫的函式中。然而,它仍然在所有這些目錄上呼叫這個函式。
uj5u.com熱心網友回復:
- 在任何包含指令之前啟用 GNU Source。
#define _GNU_SOURCE
- 在標志中呼叫
nftw()啟用之前。FTW_ACTIONRETVAL這使得可以nftw()根據來自 的回傳值追索其執行callback_function()。
/* snippet from nftw manpage */
#define MAX_OPEN_FDS 64
flags |= FTW_ACTIONRETVAL; // enables callback_function() to recourse
if (nftw ((argc < 2) ? "." : argv[1], callback_function, MAX_OPEN_FDS, flags)
== -1) {
perror ("nftw");
exit (EXIT_FAILURE);
}
- 如果目錄高于所需級別,則在
callback_function()開頭本身會跳過目錄。
#define DEPTH_LIMIT 1
/*
...
*/
int
callback_function (const char *fpath, const struct stat *sb,
int tflag, struct FTW *ftwbuf) {
// works even when FTW_DEPTH is enabled.
// at the top first condition to check;
if (ftwbuf->level > DEPTH_LIMIT) return FTW_SKIP_SIBLINGS;
/*
...
*/
return FTW_CONTINUE;
}
每當
nftw()回傳與跨越 的目錄中的檔案時DEPTH_LIMIT,FTW_SKIP_SIBLINGS指示它跳過該目錄并繼續父目錄中的兄弟姐妹。如果省略
FTW_DEPTHinnftw()flags,則可以使用FTW_SKIP_SUBTREE功能;wherenftw()立即跳過目錄。FTW_DEPTH指示在遍歷目錄中的所有檔案和子目錄后nftw()傳遞目錄本身。這種對目錄的遍歷使其難以使用;post-orderFTW_SKIP_SUBTREE
// without `FTW_DEPTH` in nftw-flags
int
callback_function (const char *fpath, const struct stat *sb,
int tflag, struct FTW *ftwbuf) {
/*
...
*/
if (DEPTH_LIMIT == ftwbuf->level && FTW_D == tflag) // a directory
return FTW_SKIP_SUBTREE; // don't get into the directory
else
return FTW_CONTINUE;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/457903.html
