C中目录和子目录中具有特定扩展名的只读文件。

C中目录和子目录中具有特定扩展名的只读文件。,c,C,我修改了这段代码,但问题是,我不能让它只向我发送具有特定扩展名的文件。我尝试了很多东西,但每次都没有得到想要的结果。任何帮助都将不胜感激。这是一个非常大的项目的一部分,我被困在这个特定的功能 static void list_dir (const char * dir_name) { DIR * d; /* Open the directory specified by "dir_name". */ d = opendir (dir_name); /* Check it wa

我修改了这段代码,但问题是,我不能让它只向我发送具有特定扩展名的文件。我尝试了很多东西,但每次都没有得到想要的结果。任何帮助都将不胜感激。这是一个非常大的项目的一部分,我被困在这个特定的功能

static void list_dir (const char * dir_name)

{



   DIR * d;

/* Open the directory specified by "dir_name". */

d = opendir (dir_name);

/* Check it was opened. */
if (! d) {
    fprintf (stderr, "Cannot open directory '%s': %s\n",
             dir_name, strerror (errno));
    exit (EXIT_FAILURE);
}
while (1) {
    struct dirent * entry;
    char * d_name;

    /* "Readdir" gets subsequent entries from "d". */
    entry = readdir (d);
    if (! entry) {
        /* There are no more entries in this directory, so break
           out of the while loop. */
        break;
    }
    d_name = entry->d_name;
      if(!strstr (d_name, ".jpg") == 0 && !strstr (d_name, ".JPG") == 0){
         continue;
     }
    /* Print the name of the file and directory. */
printf ("%s\n", d_name);


/* If you don't want to print the directories, use the
   following line: */

    //if (! (entry->d_type & DT_DIR)) {
    //printf ("%s/%s\n", dir_name, d_name);
//}


    if (entry->d_type & DT_DIR) {

        /* Check that the directory is not "d" or d's parent. */

        if (strcmp (d_name, "..") != 0 && strcmp (d_name, ".") != 0) {
            int path_length;
            char path[PATH_MAX];

            path_length = snprintf (path, PATH_MAX,
                                    "%s/%s", dir_name, d_name);
            //printf ("%s\n", path);
            if (path_length >= PATH_MAX) {
                fprintf (stderr, "Path length has got too long.\n");
                exit (EXIT_FAILURE);
            }
            /* Recursively call "list_dir" with the new path. */
              if(!strstr (d_name, ".jpg") == 0 && !strstr(d_name, ".JPG") == 0){
         continue;
     }
            list_dir (path);
        }
}
}
/* After going through all the entries, close the directory. */
if (closedir (d)) {
    fprintf (stderr, "Could not close '%s': %s\n",
             dir_name, strerror (errno));
    exit (EXIT_FAILURE);
}

}

您应该知道,仅仅使用
.jpg“
.jpg”
并不能解决区分大小写的问题,因为可能会有更多类似于
“.jpg”
的内容

你可以试试这个

int endsWith(const char *const filename, const char *const extension)
 {
    size_t fileNameLength;
    size_t extensionLength;

   if ((filename == NULL) || (extension == NULL))
       return 0;

    fileNameLength  = strlen(filename);
    extensionLength = strlen(extension);

    return (strcasecmp(extension, filename + filenameLength - extensionLength) == 0);

}
那你就可以了

if (endsWidth(d_name, ".jpg") != 0) /* it has jpeg extension */
注意
strcasecmp()
不是标准配置,您可以通过谷歌搜索找到正确的c库替代方案


还有一些库使用所谓的magic字节检查文件类型,它们通常是文件内容中的前4个左右字节,甚至还有一个叫做
libmagic
,尽管我从未使用过,所以我不能给你关于如何使用它的建议。

你应该知道,仅仅使用
“.jpg”
“.jpg”
并不能解决区分大小写的问题,因为可能会有更像
“.jpg”
等等

你可以试试这个

int endsWith(const char *const filename, const char *const extension)
 {
    size_t fileNameLength;
    size_t extensionLength;

   if ((filename == NULL) || (extension == NULL))
       return 0;

    fileNameLength  = strlen(filename);
    extensionLength = strlen(extension);

    return (strcasecmp(extension, filename + filenameLength - extensionLength) == 0);

}
那你就可以了

if (endsWidth(d_name, ".jpg") != 0) /* it has jpeg extension */
注意
strcasecmp()
不是标准配置,您可以通过谷歌搜索找到正确的c库替代方案


此外,还有一些库使用所谓的magic字节来检查文件类型,它们通常是文件内容中的前4个左右字节,甚至还有一个叫做
libmagic
,尽管我从未使用过它,所以我不能给你关于如何使用它的建议。

我将替换该行

if(!strstr (d_name, ".jpg") == 0 && !strstr (d_name, ".JPG") == 0){
使用更具可读性的代码:

if( fileIsNotJPGFile(d_name) ) {
并将其功能实现为:

int fileIsJPGFile(char const* name)
{
   return (strstr(name, ".jpg") || strstr(name, ".JPG"));
}

int fileIsNotJPGFile(char const* name)
{
   return !(fileIsJPGFile(name));
}

我会更换电话线

if(!strstr (d_name, ".jpg") == 0 && !strstr (d_name, ".JPG") == 0){
使用更具可读性的代码:

if( fileIsNotJPGFile(d_name) ) {
并将其功能实现为:

int fileIsJPGFile(char const* name)
{
   return (strstr(name, ".jpg") || strstr(name, ".JPG"));
}

int fileIsNotJPGFile(char const* name)
{
   return !(fileIsJPGFile(name));
}

告诉我,什么是
!strstr(d_name,“.jpg”)==0
do?你得到了什么?你期待什么?你为什么期待你得到的?你能把它构建成一个独立的程序并进行测试吗?immibis。这是我运行的原始代码中的一个输入错误。我修好了。该行应该是if((strstr(d_name,.jpg)和&strstr(d_name,.jpg))否;它不应该是
if(strstr(d_name,.jpg)和&strstr(d_name,.jpg))
,除非您只想匹配单个文件名,例如
MY.jpg.has.jpg
。您需要
| |
@immibis解决您的问题;您把
搞错了(d_name,“.jpg”)
strstr(d_name,“.jpg”)==0
.Jonathan;我希望只有扩展名为jpg的文件,但我最终得到了目录和子目录中的所有文件。有一次,我只得到了没有扩展名为jpg的文件,当我更改了逻辑,但没有使用strstr命令时,它没有帮助。告诉我,
!strstr(d_name,.jpg)有什么作用==0
do?你得到了什么?你期望什么?你为什么期望得到什么?你能把它构建成一个自包含的程序并测试它吗?immibis。这是我运行的原始代码中的一个输入错误。我修复了它。那一行应该读if((strstrstr(d_name,.jpg)和&strstrstr(d_name,.jpg)),不;它不应该读
if(strstr)(d_name,“.jpg”)和&strstr(d_name,“.jpg”)
除非您只想匹配单个文件名,例如
MY.jpg.has.jpg
。您需要
|
@immibis解决您的问题;您将
!strstr(d_name,.jpg”)
str(d_name,.jpg)混淆了==0
.Jonathan;我只希望文件具有jpg扩展名,但我最终得到了我的目录和子目录中的所有文件。有一次,我只得到了没有jpg扩展名的文件,当我更改了该文件的逻辑,但禁用了strstrstr命令时,它没有任何帮助。另外注意:在Windows上,stracecmp被称为
stricmp
.Ad附加说明:在Windows上,stracecmp被称为
stricmp