我開發了一個函式來遞回洗掉一個目錄nftw():
#include <errno.h>
#include <string.h>
#include <ftw.h> /* for nftw() */
int unlink_cb(
const char *fpath, const struct stat *sb, int typeflag, struct FTW *ftwbuf)
{
if(typeflag != FTW_D) {
return remove(fpath);
}
return 0;
}
int rm_rf(const char *path)
{
return nftw(path,
unlink_cb,
64 /* number of simultaneously opened fds, up to OPEN_MAX */,
FTW_DEPTH | FTW_PHYS);
}
int main(int argc, const char *argv[])
{
rm_rf("any");
}
這將洗掉目錄及其內容。但我只想洗掉內容而不洗掉頂級目錄本身。
有沒有辦法添加一些檢查來跳過頂部目錄的洗掉?
uj5u.com熱心網友回復:
首先,typeflag != FTW_D在這種情況下,測驗是無用的,因為FTW_DEPTH標志nftw指示它以后序遍歷目錄,然后nftw永遠不會將標志傳遞給呼叫的例程,該標志FTW_D指示正在按前序遍歷目錄。對于它以后序遍歷的目錄,它通過FTW_DP.
您可以將測驗更改為typeflag != FTW_DP,然后程式將永遠不會洗掉任何目錄,因此它不會洗掉樹的頂層目錄。
但是,要讓程式洗掉除頂部之外的所有檔案和子目錄,您可以使用struct FTW傳遞的級別指示器。該level成員表示當前物件的深度,0 表示頂層目錄,1 表示其中的物件,2 表示其中的物件,依此類推。所以測驗可以很簡單:
if (0 < ftwbuf->level)
return remove(fpath);
請注意,您的程式應該使用#include <stdio.h>來宣告remove.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/410333.html
標籤:
下一篇:fscanf列印未知值
