C言語

【C言語】第10章第10回:応用例 – 実用的なツールの完成

本記事では、C言語を用いて実用的なツールとしてファイル検索プログラムを作成します。ディレクトリの探索や条件に応じたファイル検索の方法を学びます。

0. 記事の概要

この記事を読むメリット

  • システムプログラミングの理解:ファイルシステムの探索方法や操作を学べます。
  • ツール開発の実践経験:検索条件に応じた機能をカスタマイズできるツールを作成します。
  • 応用力の向上:検索プログラムを拡張して、他のファイル操作ツールを作成する基盤を得られます。

この記事で学べること

  • ディレクトリ探索の基本
  • 条件付きファイル検索
  • 結果のフォーマットと表示方法

1. ファイル検索ツールの基本設計

1.1 ツールの基本機能

このツールでは以下の基本機能を実装します。

  • 指定されたディレクトリ内のファイルを一覧表示
  • 検索条件に基づくファイルのフィルタリング
  • 検索結果の保存

1.2 必要なプログラム構造

プログラムは以下の主要部分で構成されます。

  • ディレクトリの探索処理
  • ファイル名のフィルタリングロジック
  • 結果のフォーマットと表示

2. コード例と詳細解説

2.1 基本コード例

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>

void searchFiles(const char *path, const char *keyword) {
    struct dirent *entry;
    DIR *dp = opendir(path);

    if (dp == NULL) {
        perror("ディレクトリを開けませんでした");
        return;
    }

    while ((entry = readdir(dp)) != NULL) {
        if (strstr(entry->d_name, keyword) != NULL) {
            printf("ファイル名: %s/%s\\n", path, entry->d_name);
        }
    }

    closedir(dp);
}

int main() {
    char path[256];
    char keyword[100];

    printf("検索するディレクトリを入力してください: ");
    scanf("%s", path);
    printf("検索キーワードを入力してください: ");
    scanf("%s", keyword);

    printf("検索結果:\\n");
    searchFiles(path, keyword);

    return 0;
}
動作解説
  1. ディレクトリのオープン:`opendir`関数を使用して指定されたディレクトリを開きます。
  2. ファイル名の探索:`readdir`で各エントリを読み取り、キーワードが含まれるファイル名を表示します。
  3. 結果の表示:`strstr`を使用して、キーワードに一致するファイルを抽出します。

3. 練習問題

以下の課題に挑戦して、ファイル検索ツールを拡張してみましょう。

  1. 再帰的にサブディレクトリを探索する機能を追加してください。
  2. 検索結果をテキストファイルに保存する機能を追加してください。
  3. ファイルの最終更新日時を取得して表示する機能を実装してください。

4. 練習問題の解答と解説

問1の解答例

// 再帰的にディレクトリを探索
void searchFilesRecursively(const char *path, const char *keyword) {
    struct dirent *entry;
    DIR *dp = opendir(path);

    if (dp == NULL) {
        perror("ディレクトリを開けませんでした");
        return;
    }

    while ((entry = readdir(dp)) != NULL) {
        if (entry->d_type == DT_DIR) {
            if (strcmp(entry->d_name, ".") != 0 && strcmp(entry->d_name, "..") != 0) {
                char newPath[1024];
                snprintf(newPath, sizeof(newPath), "%s/%s", path, entry->d_name);
                searchFilesRecursively(newPath, keyword);
            }
        } else {
            if (strstr(entry->d_name, keyword) != NULL) {
                printf("ファイル名: %s/%s\\n", path, entry->d_name);
            }
        }
    }

    closedir(dp);
}

この関数では、サブディレクトリを再帰的に探索し、すべてのファイルを対象に検索を行います。

5. まとめ

本記事では、C言語を用いて基本的なファイル検索ツールを作成しました。さらに多くの機能を追加して、実用的なツールを開発してみましょう。