我怎样才能仅从目录txt文件在C?(How can I get only txt files fro

2019-09-24 07:51发布

我想获得的唯一的* .txt文件名称在指定目录下,某事像这样:

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <dirent.h>

int main(int argc, char **argv)
{
    char *dirFilename = "dir";

    DIR *directory = NULL;

    directory = opendir (dirFilename);
    if(directory == NULL)
        return -1;

    struct dirent *ent;

     while ((ent = readdir (directory)) != NULL)
     {
         if(ent->d_name.extension == "txt")
            printf ("%s\n", ent->d_name);
     }

    if(closedir(directory) < 0)
        return -1;

    return 0;
}

我怎样才能做到这一点纯unixs C吗?

Answer 1:

首先,Unix有没有文件扩展名的概念,所以没有extension的成员struct dirent 。 其次,你不能比较字符串== 。 您可以使用类似

bool has_txt_extension(char const *name)
{
    size_t len = strlen(name);
    return len > 4 && strcmp(name + len - 4, ".txt") == 0;
}

所述> 4部分确保了文件名.txt不匹配。

(获得bool<stdbool.h>



Answer 2:

您可以使用glob()函数调用了点。 更多信息使用您最喜爱的搜索引擎,Linux手册页,或点击这里 。

#include <glob.h>
#include <stdio.h>

int main(int argc, char **argv) {
  const char *pattern = "./*.txt";
  glob_t pglob; 

  glob(pattern, GLOB_ERR, NULL, &pglob);      

  printf("Found %d matches\n", pglob.gl_pathc);
  printf("First match: %s\n", pglob.gl_pathv[0]);

  globfree(&pglob);


  return 0;
}


Answer 3:

可能性:

while ((ent = readdir (directory)) != NULL)
{
    const size_t len = strlen(ent->d_name);
    if (len > 4                     &&
        ent->d_name[len - 4] == '.' &&
        ent->d_name[len - 3] == 't' &&
        ent->d_name[len - 2] == 'x' &&
        ent->d_name[len - 1] == 't')
    {
        printf ("%s\n", ent->d_name);
    }
}


Answer 4:

你几乎没有,你只需要检查文件名以.txt 。 要做到这一点的方法之一是使用strcmpstrcasecmp ,或memcmp

while ((ent = readdir (directory)) != NULL)
{
    int len = strlen(ent->d_name);
    if(len > 4 && memcmp(ent->d_name + len - 4, ".txt", 4) == 0)  // only checks lowercase
    {
        // It's a .txt file - now check that it's a regular file
        char filename[PATH_MAX];
        snprintf(filename, sizeof(filename), "%s/%s", dirFilename, ent->d_name);
        struct stat st;
        if(stat(filename, &st) == 0 && S_ISREG(st.st_mode))
        {
            // It's a regular file - process it
        }
    }
}

这是一个好主意,以确认它是一个普通的文件(而不是目录或其他类型的特殊文件)通过调用stat(2)完整的文件路径和检查st_mode与现场S_ISxxx宏。 需要注意的是d_type的成员DIR结构由归国readdir并不总是支持,所以它不依赖于它是一个好主意。

或者,而不是使用opendirreaddir ,和closedir ,您可以使用glob(3)功能:

glob_t globbuf;
if(glob("/path/to/dir/*.txt", 0, NULL, &globbuf) == 0)
{
  int i;
  for(i = 0; i < globbuf.gl_pathc; i++)
    process_filename(globbuf.gl_pathv[i]);
}
globfree(&globbuf);


Answer 5:

@BartFriedrich了点出来的glob()函数,但他没有的它的使用举一个例子。 简单地说(和完全未经测试),你可以尝试这样的事

#include <glob.h>
#include <stdio.h>

void glob_example() {
    glob_t g;
    int i;
    glob("*.txt", 0, NULL, &g);
    for (i = 0; i < g.gl_pathc) 
        printf("matched: %s\n", g.pathv[i]);
    globfree(&g)
}

glob()实际上是详细一个相当复杂的功能,并为更广泛的文件匹配要求我可能不会使用它,但它确实有效地处理你的问题。 欲了解更多信息,请man glob您的Linux机器上或者在看手册页联机 。



Answer 6:

你可以写一个函数的endsWith:

int endswith (const char *name, const char *suffix)

只是做一个反向循环(从月底开始)throught后缀,并检查是否每个字符是相同的。



文章来源: How can I get only txt files from directory in c?