如何使用c将目录的文件名添加到数组结构中

How to add names of files of a directory to an array structure using c

谁能告诉我如何使用 C 中的结构数组将目录路径保存在目录中。在下面的代码中,谁能告诉我哪里需要更改?

#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <dirent.h>
#include <sys/dir.h>
#include <locale.h>
#include <stdint.h>
#include <string.h>

#define FALSE 0
#define TRUE ! FALSE

typedef struct{
    char *path;
}filepath;

struct stat sb;
extern int alpahsort();
int dir_detect(char *name);

int main (int argc, char *argv[])
{
    filepath my_array_path[100];
    char *each_name;
    const char *pathname=NULL;
    char success; int ret=0;
    struct direct **files;
    int j=0,i,count,count_dir;
    int file_select();
    if (argc != 2) {
        fprintf(stderr, "Usage: %s <pathname>\n", argv[0]);
        exit(EXIT_FAILURE);
    }
    printf("%s\n",argv[1]);
    pathname=argv[1];
    printf("%s\n",pathname);
    DIR *dp;
    struct dirent *ep;
    dp = opendir (pathname);

    count = scandir(pathname, &files, file_select, alphasort);

    if (dp != NULL)
    {
        while ((ep = readdir (dp))!=NULL){
            printf("the number of files=%d\n",count);
            char *buffer;


            //from here ....
            //my_array_path[i].path=malloc(strlen(buffer+1));
            //strcpy(my_array_path[i].path,buffer);
            my_array_path[i].path=strdup(ep->d_name);
            printf("the name of the file is %s\n",my_array_path[i].path);
            // to here......

我想知道我的做法是否正确。其他代码如下。

您可以通过动态内存分配来做到这一点。

将变量声明为,

filepath mypath;

考虑buffer有一个目录的路径,然后这样做,

int i=0;
mypath[i].path=malloc(strlen(buffer+1);
strcpy(mypath[i].path,buffer);

否则strdup函数,

mypath[i].path=strdup(buffer);

然后递增该变量以存储下一个路径。并检查不超过结构中给定值的条件。

typedef struct{
  char *path[255];
}filepath;

//in main

filepath mypath;
char *buffer=malloc(255);
int i=0;
strcpy(buffer,"/tmp");
mypath[i].path=malloc(strlen(buffer)+1);
strcpy(mypath[i].path,buffer);
printf("path:%s\n",mypath[i].path);

C 提供了两种读取目录内容的主要方法,类似于读取文件的两种方法。就像您可以选择使用低级 read/write 无缓冲输入例程读取文件或使用 FILE* 文件流读取文件一样,您也可以选择读取目录。

对于目录,您可以选择 readdir,其中每次调用该函数都会 return 一个 指针 指向 direct struct 中的文件目录,将文件位置指示器移动到下一个要读取的文件。您必须重复调用 readdir 才能访问目录中的所有文件。

第二种目录访问依赖于 scandir,其中 return 是一个指向 数组 dirent structs 包含所有 files/dir 从该目录读取。使用 scandir,您只需遍历 returned 数组即可访问目录中包含的每个 files/dir。

所以这两种方法之间的主要区别是 readdir returns 是指向文件的单个指针,scandir returns 是指向包含所有文件的数组的指针目录。 scandir 还为 files/dir 目录列表提供了几个预定义的排序例程。 (alphasort, 和 versionsort) 提供了一种方便的方法来对 direct struct entries 进行排序。请注意,要使用预定义的排序例程,您必须在代码中包含对 _BSD_SOURCE 的定义。

下面显示了在小目录上使用 scandir 和预定义 alphasort 的示例:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>  /* opendir  */
#include <dirent.h>     /* opendir, readdir, scandir  */
#include <errno.h>

#ifndef _BSD_SOURCE     /* for scandir sort routines  */
#define _BSD_SOURCE
#endif /* _BSD_SOURCE */

int sdfilt (const struct dirent *de);

int main (int argc, char **argv) {

    if (argc < 2 )
        fprintf (stderr, "warning: usage: %s [dirname (default '.')][mode (default 14)\n", argv[0]);


    char *dname = (argc > 1) ? argv[1] : ".";   /* directory name to get listing of */
    struct dirent **namelist = NULL;            /* dirent structure to hold listing */
    int ndir = 0;                               /* num dirs scandir returns, -1 err */
    size_t it = 0;                              /* simple iterator for dir list     */

    /* call scandir to fill pointer to array of dirent entries  */
    if ((ndir = scandir (dname, &namelist, sdfilt, alphasort)) < 0)
    {
        perror("scandir");  /* throw error & return on failure  */
        return 1;
    }

    /* print each of the entries in alphasort order  */
    printf ("\nscandir example (alphasort):\n\n");
    for (it = 0; it < ndir; it++)
        printf("  nl[%2zu] %s\n", it, namelist[it]->d_name);

    /* print each entry in reverse sort order & free */
    printf ("\nreverse:\n\n");
    it = ndir;
    while (it--) {
        printf("  nl[%2zu] %s\n", it, namelist[it]->d_name);
        if (namelist[it]->d_name)
            free (namelist[it]);
    }
    free(namelist);

    printf ("\n");

    return 0;
}

/* simple scandir filter that omit strings and
dot files '.' and '..' from dirent entries */
int sdfilt (const struct dirent *de)
{
    if (strcmp (de->d_name, ".") == 0 || strcmp (de->d_name, "..") == 0)
        return 0;
    else
        return 1;
}

输出

$ ./bin/scandir_simple tmp

scandir example (alphasort):

  nl[ 0] bin
  nl[ 1] d1
  nl[ 2] d2
  nl[ 3] rdrmstat.c
  nl[ 4] rmftw-io-out.txt
  nl[ 5] walk-ftw-test.c
  nl[ 6] walk-nftw-test.c

reverse:

  nl[ 6] walk-nftw-test.c
  nl[ 5] walk-ftw-test.c
  nl[ 4] rmftw-io-out.txt
  nl[ 3] rdrmstat.c
  nl[ 2] d2
  nl[ 1] d1
  nl[ 0] bin