cuốn sách gpt4 ai đã làm

C - Scandir điền vào danh sách chỉ sử dụng các thư mục

In lại Tác giả: Vũ trụ không gian Thời gian cập nhật: 2023-11-04 07:12:49 27 4
mua khóa gpt4 Nike

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?

câu trả lời hay nhất

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;
}

Về việc C - Scandir chỉ điền vào danh sách các thư mục, chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/27023697/

27 4 0
không gian vũ trụ
Hồ sơ

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá taxi Didi miễn phí
Phiếu giảm giá taxi Didi
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress