C言語関係掲示板

過去ログ

No.375.サブディレクトリの検索方法

[戻る] [ホームページ]
No.2499

サブディレクトリの検索方法
投稿者---tak(2002/08/26 15:29:15)


質問があります。
今、ファイルを検索してコマンドラインで指定した文字列が
ファイルの中にあれば、その文字列を取り出して出力させる。
といったプログラムを作っているのですが、
findfirst,findnextなどを使って同じディレクトリのファイルを検索する
ことはできるのですが、サブディレクトリの検索の仕方が分かりません。
どなたか教えていただけないでしょうか。
よろしくお願いします。


No.2503

Re:サブディレクトリの検索方法
投稿者---長月葵(2002/08/26 20:42:40)


>今、ファイルを検索してコマンドラインで指定した文字列が
>ファイルの中にあれば、その文字列を取り出して出力させる。
>といったプログラムを作っているのですが、
>findfirst,findnextなどを使って同じディレクトリのファイルを検索する
>ことはできるのですが、サブディレクトリの検索の仕方が分かりません。

個人的にタイムリーなネタですねw
丁度昨日同じ様なお題で遊んでました。
とりあえずBCCと仮定します。
findfirstの第三引数に | _A_SUBDIR か | FA_DIREC を追加してみて下さい。
findfirstの検索対象にサブディレクトリが含まれます。(但し、サブディレクトリを見つけるだけなのでもう一工夫要ります)
ここの過去ログに参考になりそうな記事がありますので、「ディレクトリ」で検索して下さい。

No.2508

Re:サブディレクトリの検索方法
投稿者---tak(2002/08/27 10:02:12)


こんにちは。

>findfirstの第三引数に | _A_SUBDIR か | FA_DIREC を追加してみて下さい。

_findfirstは引数は2つしか指定できないのですが・・・
すいません。初心者なんでその辺よく分からないんです。
ちなみに環境はWinでVC++を使っています。

No.2509

Re:サブディレクトリの検索方法
投稿者---かずま(2002/08/27 10:49:33)


> _findfirstは引数は2つしか指定できないのですが・・・
> すいません。初心者なんでその辺よく分からないんです。

_findfirst の引数が 2つだとわかっているのは、マニュアルを見ている
ということですよね。そこに使用例は載っていませんか。
とりあえず、私の書いたプログラムを説明なしに提示しますので、
どういう意味なのかを自分でよく調べてみてください。

#include <stdio.h>
#include <string.h>
#include <io.h>

void grep(const char *path, const char *str)
{
    char buf[1024];
    FILE *fp = fopen(path, "r");
    if (fp == NULL) {
        printf("can't open %s\n", path); return;
    }
    while (fgets(buf, sizeof buf, fp)) {
        if (strchr(buf, '\n') == NULL) /* may be binary file */
            return;
        if (strstr(buf, str))
            printf("%s: %s", path, buf);
    }
    fclose(fp);
}

void dir(char *path, int len, const char *str)
{
    struct _finddata_t fd;   long handle;   int n;

    strcpy(path + len, "\\*");
    handle = _findfirst(path, &fd);
    if (handle == -1) return;
    do {
        if (strcmp(fd.name, "..") == 0) continue;
        if (strcmp(fd.name, ".") == 0) continue;
        n = sprintf(path + len, "\\%s", fd.name);
        if (fd.attrib & _A_SUBDIR)
            dir(path, len + n, str);
        else
            grep(path, str);
    } while (_findnext(handle, &fd) == 0);
    _findclose(handle);
}

int main(int argc, char **argv)
{
    char path[4096];

    if (argc != 3) { printf("usage: %s string path", argv[0]); return 1; }
    strcpy(path, argv[2]);
    dir(path, strlen(path), argv[1]);
    return 0;
}


No.2512

Re:サブディレクトリの検索方法
投稿者---かずま(2002/08/27 10:56:00)


>とりあえず、私の書いたプログラムを説明なしに提示しますので、

訂正です。return ではなく、break でした。
>    if (strchr(buf, '\n') == NULL) /* may be binary file */
>        return;

    if (strchr(buf, '\n') == NULL) /* may be a binary file */
        break;