Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】SplFileObject::ftruncate()メソッドの使い方

ftruncateメソッドの使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

ftruncateメソッドは、SplFileObjectクラスのインスタンスが表すファイルの長さを変更するメソッドです。具体的には、ファイルのサイズを指定したバイト数に切り詰める、あるいは拡張する処理を実行します。このメソッドは、ファイルの内容を保持しつつ、その物理的なサイズを調整したい場合に利用されます。

引数としてsize(整数)を受け取ります。このsizeがファイルの新しい長さとなります。現在のファイルサイズよりも小さいsizeを指定した場合、ファイルは指定された長さに切り詰められ、超過した部分のデータは完全に失われますので注意が必要です。一方、現在のファイルサイズよりも大きいsizeを指定した場合、ファイルは指定された長さまで拡張され、新しく追加された領域はヌルバイト(バイナリ0)で埋められます。

このメソッドが正常に実行された場合はtrueを、何らかの理由でファイルの長さの変更に失敗した場合はfalseを返します。ftruncateメソッドを使用する際は、対象のファイルが書き込み可能なモードで開かれている必要があります。また、データ損失のリスクがあるため、特にファイルの一部を削除する形で切り詰める場合は、事前にバックアップを取るなどの対策を検討することが重要です。このメソッドは、ファイルの内容を編集するのではなく、ファイルの物理的なサイズを管理する目的で使用されることを理解してください。

構文(syntax)

1<?php
2$file = new SplFileObject('path/to/your/file.txt', 'r+');
3$success = $file->ftruncate(100);

引数(parameters)

int $size

  • int $size: ファイルを切り詰めるバイト単位のサイズを指定する整数

戻り値(return)

bool

ファイルポインタの位置からファイルサイズを指定された長さに切り詰める(または拡張する)操作が成功したかどうかを真偽値で返します。成功した場合はtrue、失敗した場合はfalseを返します。

サンプルコード

PHP ftruncate でファイルを切り詰める

1<?php
2
3/**
4 * SplFileObject::ftruncate メソッドの利用例を初心者向けに示します。
5 *
6 * この関数は、一時ファイルを作成し、内容を書き込み、
7 * その後 SplFileObject::ftruncate メソッドを使って
8 * ファイルを指定したサイズに切り詰める方法を実演します。
9 *
10 * @return void
11 */
12function demonstrateFtruncate(): void
13{
14    // 一時ファイル名を定義します。スクリプトが実行されるディレクトリに作成されます。
15    $tempFile = 'ftruncate_example.txt';
16
17    // もし前回の実行でファイルが残っていたら削除し、クリーンな状態にします。
18    if (file_exists($tempFile)) {
19        unlink($tempFile);
20    }
21
22    // 1. ファイルに初期コンテンツを書き込みます。
23    // 日本語を含まないASCII文字を使用しているため、1文字1バイトとして扱われます。
24    $initialContent = "Hello, PHP beginners!\nThis is a test file for ftruncate.\nIt has multiple lines of text.\n";
25    file_put_contents($tempFile, $initialContent);
26    echo "--- 初期状態 ---\n";
27    echo "ファイル名: " . $tempFile . "\n";
28    echo "初期コンテンツ:\n" . file_get_contents($tempFile) . "\n";
29    echo "初期サイズ: " . filesize($tempFile) . " バイト\n\n";
30
31    // 2. SplFileObject インスタンスを作成してファイルを開きます。
32    // 'r+' モードは、ファイルが存在する場合に読み書き両用で開き、ファイルポインタを先頭に置きます。
33    // ftruncate を使用するにはファイルに対する書き込み権限が必要です。
34    try {
35        $file = new SplFileObject($tempFile, 'r+');
36
37        // 3. ftruncate メソッドを使ってファイルを切り詰めます。
38        // ここではファイルのサイズを20バイトに切り詰めます。
39        // 元のコンテンツは "Hello, PHP beginners" までになります。
40        $truncateSize = 20;
41        echo "--- ftruncate 実行 ---\n";
42        echo "ファイルを " . $truncateSize . " バイトに切り詰めます。\n";
43
44        if ($file->ftruncate($truncateSize)) {
45            echo "ftruncate に成功しました。\n\n";
46
47            // 4. 切り詰め後のファイル内容とサイズを確認します。
48            // ftruncate 実行後、ファイルポインタの位置は変わらない可能性があるため、
49            // 正しい内容を読み出すために、まずファイルポインタを先頭に戻します。
50            $file->seek(0);
51            // 現在のファイルサイズを取得し、そのサイズ分だけコンテンツを読み込みます。
52            $truncatedContent = $file->fread(filesize($tempFile));
53
54            echo "--- 切り詰め後 ---\n";
55            echo "ファイル名: " . $tempFile . "\n";
56            echo "切り詰め後のコンテンツ:\n" . $truncatedContent . "\n";
57            echo "切り詰め後のサイズ: " . filesize($tempFile) . " バイト\n\n";
58
59        } else {
60            echo "ftruncate に失敗しました。\n\n";
61        }
62
63    } catch (Exception $e) {
64        // ファイルが見つからない、書き込み権限がないなどのエラーをキャッチします。
65        echo "エラーが発生しました: " . $e->getMessage() . "\n";
66    } finally {
67        // 5. 後処理: 作成した一時ファイルを削除します。
68        // SplFileObject はスクリプト終了時やオブジェクトがスコープを抜けるときに自動的に閉じられますが、
69        // ファイル自体を削除してディスクをクリーンアップします。
70        if (file_exists($tempFile)) {
71            unlink($tempFile);
72            echo "一時ファイル '" . $tempFile . "' を削除しました。\n";
73        }
74    }
75}
76
77// 関数を実行して SplFileObject::ftruncate の動作を確認します。
78demonstrateFtruncate();
79

PHPのSplFileObject::ftruncateメソッドは、開いているファイルのサイズを特定のバイト数に「切り詰める」機能を提供します。このメソッドは、SplFileObjectのインスタンスに対して使用され、引数として整数型の$sizeを受け取ります。$sizeには、ファイルを何バイトの長さにしたいかを指定し、ファイルの先頭から指定されたバイト数までのデータが保持されます。指定されたサイズが現在のファイルサイズより小さい場合、超過する部分は削除されます。逆に大きい場合は、ファイルは拡張され、新規に追加された領域はヌル文字で埋められることがあります。このメソッドは、切り詰めが成功すればtrueを、失敗すればfalseをブール値で返します。

サンプルコードでは、まず「ftruncate_example.txt」という一時ファイルを作成し、初期のテキストデータを書き込みます。その後、このファイルをSplFileObjectとして「r+」(読み書き両用)モードで開きます。$file->ftruncate(20)のようにメソッドを呼び出すことで、ファイルのサイズを20バイトに切り詰めます。これにより、元のコンテンツの先頭20バイトのみが残り、それ以降のデータは破棄されます。切り詰め操作の成功後、ファイルポインタをseek(0)でファイルの先頭に戻し、fread()で新しい内容を読み出して、ファイルが正しく変更されたことを確認します。最後に、作成した一時ファイルを削除してディスクをクリーンアップしています。これにより、ファイル内容を効率的に管理できることが理解できます。

SplFileObject::ftruncateは、ファイルを指定したバイト数に切り詰める機能です。このメソッドを使うには、ファイルを読み書きモード(例: 'r+')で開く必要があります。引数の$sizeはバイト単位ですので、日本語などのマルチバイト文字を含むファイルを扱う場合は、文字数とバイト数が異なることに注意してください。ftruncateを実行するとファイル内容は永続的に変更され、元の状態には戻せません。必ず戻り値のboolで成功・失敗を確認し、失敗時はエラー処理を行うことが大切です。また、ftruncate実行後もファイルポインタの位置はそのままのため、切り詰め後の内容を読み出す前にはseek(0)などでファイルポインタを先頭に戻すようにしてください。

PHP SplFileObject::ftruncateでファイルを切り詰める

1<?php
2
3/**
4 * SplFileObject::ftruncate メソッドの使用例を示します。
5 * ファイルを特定のサイズに切り詰める方法を実演します。
6 */
7function demonstrateSplFileObjectFtruncate(): void
8{
9    // 一時ファイルのパスを生成します。
10    $filePath = sys_get_temp_dir() . DIRECTORY_SEPARATOR . 'ftruncate_example.txt';
11    // 初期ファイルに書き込むコンテンツを定義します。
12    $initialContent = "This is some sample text for testing the ftruncate method.";
13    // ファイルを切り詰める目標サイズを定義します。
14    $targetSize = 10; // ファイルを最初の10バイトに切り詰めます。
15
16    // 1. サンプルファイルを作成し、初期データを書き込みます。
17    file_put_contents($filePath, $initialContent);
18
19    try {
20        // 2. SplFileObject インスタンスを作成し、ファイルを開きます。
21        // 'r+' モードはファイルを読み書き用にオープンします。
22        // ftruncate メソッドを使用するには書き込み権限が必要です。
23        $fileObject = new SplFileObject($filePath, 'r+');
24
25        echo "ファイル作成: {$filePath}\n";
26        // ファイルの内容を読み込み、表示します。
27        // fread() はポインタを進めるため、一度 rewimd() してから読み込みます。
28        $fileObject->rewind();
29        echo "初期内容: '" . $fileObject->fread($fileObject->getSize()) . "'\n";
30        // ファイルポインタを先頭に戻します。
31        $fileObject->rewind();
32        echo "初期サイズ: " . $fileObject->getSize() . " バイト\n\n";
33
34        // 3. ftruncate メソッドを使用してファイルを指定したサイズに切り詰めます。
35        echo "ファイルを {$targetSize} バイトに切り詰めます...\n";
36        $success = $fileObject->ftruncate($targetSize);
37
38        if ($success) {
39            echo "ftruncate 成功。\n";
40            // ファイルポインタを先頭に戻し、切り詰め後の内容を表示します。
41            $fileObject->rewind();
42            echo "切り詰め後の内容: '" . $fileObject->fread($fileObject->getSize()) . "'\n";
43            // ファイルポインタを再度先頭に戻して、現在のファイルサイズを取得します。
44            $fileObject->rewind();
45            echo "切り詰め後のサイズ: " . $fileObject->getSize() . " バイト\n";
46        } else {
47            echo "ftruncate 失敗。\n";
48        }
49    } catch (RuntimeException $e) {
50        // ファイルのオープン失敗など、SplFileObject関連のエラーをキャッチします。
51        echo "エラーが発生しました: " . $e->getMessage() . "\n";
52    } finally {
53        // 4. クリーンアップ:作成した一時ファイルを削除します。
54        if (file_exists($filePath)) {
55            unlink($filePath);
56            echo "\nサンプルファイルを削除しました。\n";
57        }
58    }
59}
60
61// 関数の実行
62demonstrateSplFileObjectFtruncate();

SplFileObject::ftruncateは、開いているファイルを指定したサイズに切り詰める(短くする)ためのメソッドです。このメソッドは、ファイルから不要なデータを削除し、特定の長さまでにする際に使用します。

引数$sizeには、ファイルを先頭から何バイトまで残すかを整数で指定します。例えば、$sizeに10を指定すると、ファイルの先頭から10バイトまでのデータが残り、それ以降のデータはすべて削除されます。メソッドが正常にファイルの切り詰めを完了した場合はtrueが、何らかの理由で失敗した場合はfalseが戻り値として返されます。

サンプルコードでは、まず一時ファイルを作成し、初期のテキストデータを書き込みます。次に、SplFileObjectクラスを用いてそのファイルを読み書き可能なモード(r+)で開きます。ftruncateはファイル内容を変更する操作であるため、書き込み権限が必要です。ファイルを開いた後、ftruncateメソッドに目標サイズ(ここでは10バイト)を渡して呼び出し、ファイルを切り詰めます。処理の成否を確認し、切り詰め後のファイル内容とサイズを表示することで、実際にファイルが短くなっていることを確認しています。最後に、作成した一時ファイルを確実に削除し、クリーンアップを行っています。

SplFileObject::ftruncateは、ファイルを指定されたバイトサイズに切り詰めるメソッドです。この操作はファイルの後半部分を削除するため、データの損失につながる可能性がある点に特に注意が必要です。本メソッドを利用するには、ファイルを必ず読み書き可能なモード(例えば 'r+')で開く必要があり、書き込み権限がない場合は処理が失敗します。

メソッドの戻り値は成功時にtrue、失敗時にfalseを返すため、必ずこの戻り値を確認して適切なエラーハンドリングを行ってください。ftruncateの実行後にファイル内容を読み込む際は、ファイルポインタが意図しない位置にある場合があるため、rewind()などでポインタをファイルの先頭に戻してから読み込むことが重要です。また、サンプルコードのように一時ファイルを使用する場合は、必ず処理の最後にファイルを削除するなどのクリーンアップを徹底し、try-catchブロックを用いてファイル操作中の予期せぬエラーにも備えるようにしてください。

関連コンテンツ

関連プログラミング言語