• 締切済み

ディスク残量が無くなってしまった場合のファイル操作

都合上、検証ができません。 最悪、『サーバーのディスク残量が無い時』に 以下3パターンの処理実行時の挙動(ちゃんとエラーが帰ってきてdieに行くのか?など)はどうなるかご存知でしたら宜しくお願い致します。  # File::Copyモジュールによるコピー時 copy ("foo.txt", "bar.txt") or die "Copy failed: $!";  # File::Copyモジュールによるムーブ時 move ("foo.txt", "bar.txt") or die "Move failed: $!";  # 書き込み時 open(OUT,"> file.txt")or die "Can't open file.txt: $!"; print OUT "DEF"; close(OUT); renameは問題ないと思っています。。

みんなの回答

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.2

#1です。 直接、ディスクフルの状態で試験した訳ではないので、自信なしですが、 エラーが発生すれば(ファイルパス名不正、アクセス権なし等)、 copy ("foo.txt", "bar.txt") or die "Copy failed: $!"; move ("foo.txt", "bar.txt") or die "Move failed: $!"; open(OUT,"> file.txt")or die "Can't open file.txt: $!"; の3行については、die以降の文が実行されますので、 ディスクフルのエラーでも、die以降の文が実行されると考えて良いと思います。 しかしながら、 print OUT "DEF"; close(OUT); についても、ディスクフルの場合は、ここでエラーが発生する可能性がありますので、 上記の2行についても、エラーチェックはすべきです。 一般論で言えば、全ての処理で、エラーチェックはきちんと行うべきです。(業務で使用しない場合は別ですが)

nerumako
質問者

お礼

ご丁寧に回答頂きまして誠にありがとうございました。 新規回答がなさそうですので締め切らせていただきます。

nerumako
質問者

補足

ご指摘ありがとうございます。 print OUT "DEF"; close(OUT); どちらかというとファイル書き込み時のエラーチェックはここでしないと意味ないかもしれませんし隋所でエラーチェックするよう心がけます。 perl4~5に変わる付近でバッファからディスクへフラッシュされる位置が変更になっているようでこれもまたどこでエラーが帰ってくるかわかりません。 (もしかしたらsysopenと混同してるかもしれません。。) ディスクフル状態でエラーが帰ってくるか否かはできれば確証が欲しいところです。 某有名シェアスクリプト内のディスクフルエラーチェック部分などを確認すると  一度tempファイルにテスト書き込み   →tempファイルの容量をチェック   →サイズが0の場合は本番書き込みに到らずに終了 のような処理を見たものですから、 エラーが帰ってくるならここまでしなくても大丈夫だと思いますので 一度バッファをディスクにフラッシュしてみないとOSは判断できないのではないか。 フラッシュしてみて入りきらなかったら最後にフラッシュされた部分を削除(ファイルサイズ0)してしまうのではないか。 しかし古いサーバー環境にも対応させるための手法なのかもしれない。など疑ってしまっている次第です。

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.1

直接の回答ではありませんが、 上記の処理で、エラーケースは、他のケースも考えられますが、(例えばアクセス権、ファイルのパス名不正等)、他のケースは全て、テスト済みで、『サーバーのディスク残量が無い時』場合のみの残ってしまったということでしょうか?

nerumako
質問者

補足

はい。 他のエラーはなく今まで正常に処理を続けていた場合で 『サーバーのディスク残量が無い時』言い換えればディスク容量が限界に達してしまった際の挙動が気になっております。 ディスク残量がない状態で書き込みなどの処理を行うと「ファイルが空になってしまう」などと耳にしましたで 書き込み及びそれに類似する危険な箇所の挙動を知りたいと言うことになります。 説明が不足しており申し訳ございませんでした。 最終的にはどの部分にディスク残量チェック処理を挿入するかを検討する為でして、 上記3箇所で もしエラーが帰ってくるならその箇所にディスク残量チェックトラップを仕掛けてファイルの破損を防ごうと考えております。 また、勝手に上記3箇所を危険扱いしておりますが上記3箇所以外でも危険と思われる箇所をご存知でしたらご教示頂ければ幸いです。