4

次のように、特定のディレクトリ内の *.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;
}

純粋なUNIX Cでこれを行うにはどうすればよいですか?

4

6 に答える 6

10

まず、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>

于 2012-10-19T14:54:22.157 に答える
7

glob()そのために関数呼び出しを使用できます。お気に入りの検索エンジン、Linux の man ページ、またはこちらを使用して詳細情報を入手してください。

#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;
}
于 2012-10-19T14:51:36.163 に答える
2

可能性:

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);
    }
}
于 2012-10-19T14:53:50.993 に答える
1

@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 マシンでチェックアウトするか、オンラインの man ページを参照してください。

于 2012-10-19T15:11:18.777 に答える