[PHP]fileinode関数の使い方 – ファイルのiノード番号を取得する方法

PHP

こんにちは!今回はPHPのfileinode関数について、基本から実践的な使い方まで解説します。

1. 基本的な使い方

// ファイルのiノード番号を取得
$filename = 'example.txt';
$inode = fileinode($filename);

if ($inode !== false) {
    echo "ファイルのiノード番号: " . $inode;
} else {
    echo "iノード番号の取得に失敗しました";
}

2. 実践的な使用例

2-1. ファイルの一意性チェック

function checkFileUniqueness($file1, $file2) {
    $inode1 = fileinode($file1);
    $inode2 = fileinode($file2);

    if ($inode1 === false || $inode2 === false) {
        throw new Exception('iノード番号の取得に失敗しました');
    }

    return [
        'are_same_file' => ($inode1 === $inode2),
        'inode1' => $inode1,
        'inode2' => $inode2
    ];
}

2-2. ハードリンクの検出

function detectHardLinks($filename) {
    if (!file_exists($filename)) {
        throw new Exception("ファイルが存在しません");
    }

    $targetInode = fileinode($filename);
    $directory = dirname($filename);
    $hardlinks = [];

    $files = scandir($directory);
    foreach ($files as $file) {
        if ($file === '.' || $file === '..') {
            continue;
        }

        $fullPath = $directory . '/' . $file;
        $currentInode = fileinode($fullPath);

        if ($currentInode === $targetInode && $fullPath !== $filename) {
            $hardlinks[] = $fullPath;
        }
    }

    return [
        'original_file' => $filename,
        'inode' => $targetInode,
        'hardlinks' => $hardlinks
    ];
}

2-3. ファイルシステム情報の取得

function getFileSystemInfo($filename) {
    return [
        'inode' => fileinode($filename),
        'device' => fileinode($filename),
        'type' => filetype($filename),
        'size' => filesize($filename),
        'permissions' => fileperms($filename),
        'owner' => fileowner($filename),
        'group' => filegroup($filename)
    ];
}

3. エラーハンドリング

function safeGetInode($filename) {
    try {
        if (!file_exists($filename)) {
            throw new Exception("ファイルが存在しません");
        }

        if (!is_readable($filename)) {
            throw new Exception("ファイルを読み取れません");
        }

        $inode = fileinode($filename);
        if ($inode === false) {
            throw new Exception("iノード番号の取得に失敗しました");
        }

        return $inode;

    } catch (Exception $e) {
        error_log("Error in safeGetInode: " . $e->getMessage());
        return false;
    }
}

4. キャッシュのクリア

function getUpdatedInode($filename) {
    // キャッシュをクリア
    clearstatcache(true, $filename);

    return fileinode($filename);
}

5. ファイル比較機能

class FileComparator {
    private $file1;
    private $file2;

    public function __construct($file1, $file2) {
        $this->file1 = $file1;
        $this->file2 = $file2;
    }

    public function compare() {
        $inode1 = fileinode($this->file1);
        $inode2 = fileinode($this->file2);

        $size1 = filesize($this->file1);
        $size2 = filesize($this->file2);

        return [
            'are_same_file' => ($inode1 === $inode2),
            'file1' => [
                'path' => $this->file1,
                'inode' => $inode1,
                'size' => $size1
            ],
            'file2' => [
                'path' => $this->file2,
                'inode' => $inode2,
                'size' => $size2
            ]
        ];
    }
}

注意点

  1. Windowsシステムではiノードがサポートされていないことがあります。
  2. キャッシュの影響を受けるため、最新の情報を得るにはclearstatcache()を使用します。
  3. パーミッションの問題でアクセスできない場合、falseが返されます。

まとめ

fileinode関数を使用する際は、以下の点に注意しましょう:

  1. OSの違いによる動作の違いへの対応
  2. 適切なエラーハンドリング
  3. キャッシュのクリア
  4. パーミッションの確認
  5. ファイルの存在確認

これらの点を意識することで、より信頼性の高いファイル管理が可能になります。

主な用途:

  • ファイルの一意性の確認
  • ハードリンクの検出
  • ファイルシステムの分析
  • ファイルの比較

APIを使用する際は、システムの特性を理解し、適切なエラーハンドリングを実装することが重要です。

タイトルとURLをコピーしました