こんにちは!今回は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
]
];
}
}
注意点
- Windowsシステムではiノードがサポートされていないことがあります。
- キャッシュの影響を受けるため、最新の情報を得るには
clearstatcache()
を使用します。 - パーミッションの問題でアクセスできない場合、falseが返されます。
まとめ
fileinode関数を使用する際は、以下の点に注意しましょう:
- OSの違いによる動作の違いへの対応
- 適切なエラーハンドリング
- キャッシュのクリア
- パーミッションの確認
- ファイルの存在確認
これらの点を意識することで、より信頼性の高いファイル管理が可能になります。
主な用途:
- ファイルの一意性の確認
- ハードリンクの検出
- ファイルシステムの分析
- ファイルの比較
APIを使用する際は、システムの特性を理解し、適切なエラーハンドリングを実装することが重要です。