如何使用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
谁能告诉我如何使用 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