Làm cách nào để sử dụng scandir để nó chỉ điền danh sách struct dirent ** của tôi với các thư mục?
Bạn có thể lọc các thực thể để được liệt kê bằng cách cung cấp hàm lọc. Hàm này sẽ trả về giá trị khác 0 nếu tệp được đưa vào danh sách.
Không may thay,trực tiếp
Các thành viên của cấu trúc không cho bạn biết liệu bạn có một thư mục hay không (mặc dù nó có hệ thống của bạn có thể bao gồm một trường loại ), vì vậy bạn phải sử dụng một cách khác để tìm thư mục, ví dụ:thống kê
:
#include
#include
#include
#include
int filter_dir(const struct dirent *e)
{
cấu trúc thống kê st;
stat(e->d_name, &st);
trở lại (st.st_mode & S_IFDIR);
}
Bạn cũng có thể thử gọi opendir
đặt tên và kiểm tra xem nó có thành công không. (Nhưng đừng quên đóng nó nếu thành công.)
Điều này hoạt động cho thư mục hiện tại vì tên không bao gồm đường dẫn. Các bộ lọc cũng không cung cấp chỗ để truyền dữ liệu bổ sung, vì vậy cách tốt nhất của bạn là xác định một biến toàn cục để giữ đường dẫn và bạn phải đặt biến đó trước.
Đây là một triển khai có chức năng bao bọc,scandir_dir
:
#include
#include
#include
#include
#include
#include
const char *filterdir tĩnh;
static int filter_dir(const struct dirent *e)
{
char buf[NAME_MAX];
cấu trúc thống kê st;
nếu (filterdir) {
snprintf(buf, sizeof(buf), "%s/%s", filterdir, e->d_name);
stat(buf, &st);
} khác {
stat(e->d_name, &st);
}
trở lại (st.st_mode & S_IFDIR);
}
int scandir_dir(const char *path, struct dirent ***namelist)
{
int n;
filterdir = đường dẫn;
n = scandir(đường dẫn, danh sách tên, filter_dir, alphasort);
filterdir = NULL;
return n;
}
int main()
{
struct dirent **namelist;
int n;
n = scandir_dir("/some/dir", &namelist);
nếu (n < 0) {
perror("scandir");
} khác {
int i;
vì (i = 0; i < n; i++) {
printf("%s\n", namelist[i]->d_name);
miễn phí(danh sách tên[i]);
}
miễn phí(danh sách tên);
}
return 0;
}
Tôi là một lập trình viên xuất sắc, rất giỏi!