fwrite
バイナリセーフなファイル書き込み処理
説明
intfalse fwrite(resource $stream
, string $data
, intnull $length
= null
)
fwriteはdata
の内容を
stream
が指しているファイル・ストリームに書き込みます。
パラメータ
-
stream
-
fopen
を使用して作成したファイルシステムポインタリソース。
-
data
-
書き込む文字列。
-
length
-
length
パラメータが数値の場合、
length
バイト数分の書き込みが完了したか、
data
が終わりに達したかのいずれか早い方の
事象により書き込みは中止されます。
戻り値
fwrite は、
書き込んだバイト数を返します。
失敗した場合に false
を返します
エラー / 例外
fwrite は、
失敗した場合に E_WARNING
を発生させます。
例
例1 簡単な fwrite の例
<?php
$filename = 'test.txt';
$somecontent = "Add this to the file\n";
// ファイルが存在しかつ書き込み可能かどうか確認します
if (is_writable($filename)) {
// この例では$filenameを追加モードでオープンします。
// ファイルポインタはファイルの終端になりますので
// そこがfwrite()で$somecontentが追加される位置になります。
if (!$fp = fopen($filename, 'a')) {
echo "Cannot open file ($filename)";
exit;
}
// オープンしたファイルに$somecontentを書き込みます
if (fwrite($fp, $somecontent) === FALSE) {
echo "Cannot write to file ($filename)";
exit;
}
echo "Success, wrote ($somecontent) to file ($filename)";
fclose($fp);
} else {
echo "The file $filename is not writable";
}
?>
注意
注意:
ネットワークストリームへの書き込みは、
すべての文字列を書き込み終える前に終了する可能性があります。
fwrite の戻り値を確かめるようにしましょう。
<?php
function fwrite_stream($fp, $string) {
for ($written = 0; $written < strlen($string); $written += $fwrite) {
$fwrite = fwrite($fp, substr($string, $written));
if ($fwrite === false) {
return $written;
}
}
return $written;
}
?>
注意:
(Windowsのように)バイナリとテキストファイルの形式が異なるシステムにおいては、ファイルをオープンする際に
fopenの mode パラメータに 'b' を指定する必要があります。
注意:
fopen を使用して追記モードでオープンした
stream
の場合、
fwrite はアトミックになります
(ただし、一部のプラットフォームにおいて data
がファイルシステムのブロックサイズを超えない場合、
そしてローカルファイルシステム上のファイルである場合に限ります)。
アトミックであるとは、つまり fwrite
をコールする前にリソースを flock
する必要がないということです。データの書き込みが中断されることはありません。
注意:
同じファイルポインタに 2 回書き込みを行うと、
データはファイルの末尾に追記されます。
<?php
$fp = fopen('data.txt', 'w');
fwrite($fp, '1');
fwrite($fp, '23');
fclose($fp);
// 'data.txt' の中身は 123 となります。23 ではありません!
?>
参考
- fread
- fopen
- fsockopen
- popen
- file_get_contents
- pack