gpt4 book ai didi

c - 列出 Linux 上给定目录中的文件

转载 作者:行者123 更新时间:2023-11-30 17:14:51 25 4
gpt4 key购买 nike

我正在使用 scandir() 列出给定目录中的 PNG 图像:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

int file_select(const struct dirent *entry)
{
struct stat st;
stat(entry->d_name, &st);
return (st.st_mode & S_IFREG); // This doesn't work
/* return (st.st_mode & S_IFDIR); */ // This lists everything
}
int num_sort(const struct dirent **e1, const struct dirent **e2) {
char* pch = strtok ((char*)(*e1)->d_name,".");
char* pch2 = strtok ((char*)(*e2)->d_name,".");
const char *a = (*e1)->d_name;
const char *b = (*e2)->d_name;
return atoi(b) > atoi(a);
}

int main(void)
{
struct dirent **namelist;
int n;

n = scandir(".", &namelist, file_select, num_sort);
if (n < 0) {
perror("scandir");/
} else {
while (n--) {
printf("File:%s\n", namelist[n]->d_name);
free(namelist[n]);
}
free(namelist);
}
}

问题是上面的代码还列出了:

.
..

我想摆脱它。为此,我使用了:

return (st.st_mode & S_IFREG);

列出所有常规文件。但是,这不会返回任何内容,而 & S_IFDIR 返回所有内容(即目录文件)。我该如何修复它?

最佳答案

尝试 (st.st_mode & S_IFMT) == S_IFREG。

在与S_IFREG比较之前,需要先对文件类型位域进行&运算。

还为这些类型的操作定义了宏,您可以找到 here (我也会在下面列出)

       S_ISREG(m)  is it a regular file?

S_ISDIR(m) directory?

S_ISCHR(m) character device?

S_ISBLK(m) block device?

S_ISFIFO(m) FIFO (named pipe)?

S_ISLNK(m) symbolic link? (Not in POSIX.1-1996.)

S_ISSOCK(m) socket? (Not in POSIX.1-1996.)

关于c - 列出 Linux 上给定目录中的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30157247/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com