2

次のサンプルコードがあります

<?php
`echo test > /tmp/test.txt`;
$f=fopen("/tmp/test.txt","w+");
`rm /tmp/test.txt`;
var_dump(fwrite($f,"test"));
fclose($f);
file_get_contents("/tmp/test.txt");

ファイルを作成し、それへのポインタを開き、ファイルを削除してから書き込みを試みます。データが書き込まれないため、fwrite が false または 0 を返すことを期待しますが、次の出力が生成されます。

int(4)

Warning: file_get_contents(/tmp/test.txt): failed to open stream: No such file or directory in /Stuff/tmp/test3 on line 7

したがって、fwrite は明らかに成功しますが、file_get_contents は期待どおりに失敗します。

fwrite が書き込まれるバイト数を返すのは予期される動作ですか? その場合、書き込みが本当に成功したかどうかをテストするにはどうすればよいですか?

これはphp 5.3.3です

4

5 に答える 5

5

返さfalseれる理由は、ファイルポインタがファイルの最後にあるためですfwrite...これfgetsは、ファイルの最後に到達したときに行うべきことです(false取得するデータがないため、返されます)...

あなたがする必要があるのは、fseek呼び出す前に呼び出しを追加することですfgets:

var_dump(fwrite($f,"test"));
fseek($f, 0);
var_dump(fgets($f));

編集:あなたの質問を理解したので(そしてそれを見ました):

さて、ここで何が起こっているのか. 理解するには、まず Linux ファイルシステムがどのように機能するかを理解する必要があります。ファイルの名前は、オペレーティング システムにとって意味がありません。INODEファイルの を指すだけです。inode にはデータなどが格納されます。また、そのファイルへのハードリンクの数への参照番号も格納されます。ファイルは、参照番号が 0 になった場合にのみ削除されます。ファイルへのポインターを開くと (fopenまたは他のシステム コールを使用して)、参照カウントが増加するのではないかと考えています。

つまり、基本的にはrm、ファイルを実行すると、ハードリンクが削除されたということです。しかし、ファイルがまだ開いていたので、i ノードにアクセスすることができましたfwrite(したがって、書き込みが成功した理由)。/tmp/test.txtそのファイル名へのハード リンクが存在しなくなったため、アクセスできませんでした。そのため、ファイルは inode のみがアクセスできるファントム ファイルになりました。しかし、そのファイルのファイル ハンドルを閉じると (fcloseまたはスクリプトを終了して)、参照カウントが 0 になり、inode が解放されます...

したがって、ファイルは存在します。呼び出した後、ファイル名からアクセスできませんrm...

それは、ファイルシステムについて私が知っていることを知ることによって集めているものです。100%正しいとは言いませんが、ある程度の仮説としては…

于 2010-11-18T14:21:23.200 に答える
2

これがLinux(および可能性のある他のUNIXライクなOS)システム上にある場合、ファイルシステム内のファイルへの参照はによって削除されますrmが、ファイルの読み取り/書き込みを行うすべてのプログラムが閉じられるまで、ファイル自体は引き続き存在します。

これは、ハードリンクがどのように機能するかによるものです。ファイルシステムのすべてのエントリは、ハードリンク、ソフトリンク、またはデバイスです。

于 2010-11-18T14:43:24.433 に答える
0

次のコードを使用すると、書き込みが成功したかどうかを確認できます。

 if (fwrite($handle, $somecontent) === FALSE) {
        echo "Cannot write to file ($filename)";
        exit;
 }
于 2010-11-18T14:17:44.277 に答える
0

最初にファイルを保存する必要があると思います

fclose($f);
于 2010-11-18T14:22:52.520 に答える
0

あなたのコードには、エラー処理などのいくつかの条件が必要です

  • ファイルが存在するかどうかを確認します
  • ファイルが書き込み可能かどうか
  • データがファイルに書き込まれたかどうか
  • データが読み取り可能かどうか
于 2010-11-18T14:25:23.900 に答える