2009-09-02 10 views
4

私は入力ファイルを置き換えるように、入力ファイルと出力ファイルの両方に同じファイル名を使用する可能性を追加することを考えています。オープンファイルを削除するのは安全ですか?

/* input == output in this case */ 
FILE *inf = fopen(input, "r"); 
remove(output); 
FILE *outf = fopen(output, "w"); 

を(もちろん、:処理されたファイルとして

が非常に大きくなることがあり、私は最善の解決策は、最初にそのようにそれを削除し、その後、ファイルを開いて、新しいものを作成、すなわちするためにだと思いますエラー処理が追加されました)

すべてのシステムで開かれているファイルを削除できるとは限りませんが、その場合はremove()が失敗しても問題ありません。

開いているファイルを削除してその内容を読み込めないシステムがなければ心配です。

C99標準では、この場合の動作を「実装定義済み」と指定しています。 SUSはその事件についても言及していない。

あなたの意見は何ですか?私は心配する必要はありますか?私はそのような解決策を避けるべきですか?

EDIT:これはいくつかのメインライン機能ではなく、入力ファイルと出力ファイルの両方に同じファイル名を指定する場合の「最後の手段」であることに注意してください。

EDIT:[OK]を、もう一つ質問:それは、この特定のケースで私が提案した解決策はただすなわち上記けどremove()のないよう、出力ファイルの書き込みのみを(開口部よりも多くの悪を行うことが可能であることも可能ですコール)。

+6

私の貴重なデータファイルにあなたのアプリケーションを使用しないように注意してください。 –

+0

READMEの専用警告で十分でしょうか、ebuildの 'pkg_postinst()'に追加する必要がありますか? (; –

+0

両方のファイル名が同じであれば間違いなく進んでください。別の名前を入力するようにログやコンソールに警告することはできますか? – vpram86

答えて

4

いいえ、それはsafeではありません。あなたのファイルシステム上で動作するかもしれませんが、他の人は失敗します。または断続的に失敗する可能性があります。実際には、オペレーティングシステムとファイルシステムによって異なります。 Solarisの詳細については、article on file rotationを参照してください。

GNU sed's '--in-place' optionをご覧ください。このオプションは、出力を一時ファイルに書き込み、元のファイルにコピーすることで機能します。これは安全で互換性のある唯一の方法です。

また、停電やプロセスが強制終了されてプログラムがいつでも失敗する可能性があることを考慮する必要があります。これが発生した場合、元のファイルは失われます。さらに、参照カウントを持つファイルシステムの場合、入力ファイルがクローズされるまで、ディスク上に両方のファイルが存在する必要があるため、一時ファイルソリューション上にはスペースを保存しないでください。

ファイルが膨大でスペースが重視され、開発者の時間が安い場合は、読み書き用に単一のファイルを開き、書き込みポインタが読み取りポインタを超えないようにすることができます。

+0

はい、私はこれらの問題を認識しています。ユーザーが入力と出力の両方に同じファイルを指定すると可能です。 –

+1

これは、出力を常に一時ファイルに書き込むという値の少なくとも一部です。さらに、慎重に入力を2番目のtempに変更し、出力tempを最終的な名前に変更し、すべてが成功した場合にのみ入力を削除することもできます。ユースケースが入力を.bakまたはそのようなものとして保持したい場合は、それに従って適切にシャッフルします。 – RBerteig

+0

あなたは本当に正しいです、私はそれについて完全に忘れました。問題は、それが現在の出力方法と衝突することですが、次の質問に役立つかどうかを尋ねます。 –

4

私が知っているオープンファイルを削除できるようにしているシステムでは、ファイルノードの参照カウントを実装しています。したがって、ファイルを削除すると、ディレクトリエントリは削除されますが、ファイルノード自体にはまだ開いているファイルハンドルからの参照が1つあります。そのような実装では、ファイルを削除することは明らかにファイルを読み続ける能力に影響を与えません。この動作を実装する他の合理的な方法は想像もつきません。

1

私はこれを常にLinux/Unixで動作させています。 Windows、OS/2、または(shudder)DOSでは決して使用しないでください。あなたが心配している他のプラットフォーム?

この動作は、実際に一時ディスクスペースを使用する場合に便利です。ファイルを読み取り/書き込み用に開いてすぐに削除します。プログラムの終了時に停電を含む何らかの理由で自動的にクリーンアップされ、他の人がそれを監視するのがずっと難しくなりますが(不可能ではありません)(/ procは手がかりを与えることができます。 。

+0

Pavel Minaevはマイクロソフトの開発者であり、 Windowsの正反対です... –

+0

リンクがありますか? – Tanktalus

+1

どこでWindowsで動作しないと言われましたか? –

関連する問題