2016-10-24 8 views
1

fileExistsAtPathのドキュメントは読み取ります ファイルシステムやファイルシステム上の特定のファイルの現在の状態に基づいて行動を述語しようとfileExistsAtPathを呼び出すのはいつか適切ですか?

は 推奨されません。そうすると、奇妙な動作や競合状態が発生する可能性があります。 の操作が成功するかどうかを事前に把握しようとするよりも、操作を試みること(ファイルをロードするか、ディレクトリを ディレクトリに作成するなど)がエラーをチェックして正常に処理するほうがはるかに良いでしょう。ファイルシステムの競合条件の詳細については、「セキュアコーディングガイド」の 競合条件と安全なファイル操作を参照してください。

しかし、これは私にとってばかげているようです。 fileExistsAtPathはBOOLを返し、通常は「動作を述語化する」ために使用され、コードパス間で選択します。条件付きでしたがって、このドキュメンテーションの言い方は、fileExistsAtPathはでないことを暗示しているようですが、それは意味をなさないものの、です。

動作を述語化しようとしないfileExistsAtPathの実用的な使用法は何ですか?存在しますか?

文書がまったく言えない場合は、動作を述語とし、警告が与えられても実際に安全なfileExistsAtPathの実用的な用途は何ですか?

答えて

2

よく「お勧めしません」は、「は決してを使用する必要があります」と同じではありません。

実際は、-fileExistsAtPath:であり、このようなAPIは長い間普及してきました。その間、プログラマーはしばしば悪用され、セキュリティ上の問題につながる恐れのある苦しい経験をしてきました。したがって、それらのドキュメントは、あなたが一般的にそれらを使用すべきではないという警告を含むように改訂されました。

特に、-fileExistsAtPath:がtrueを返したという理由だけで、ファイルにアクセスするときにファイルが存在するとは限りません。そして、それがfalseを返したからといって、その場所に何かを作成しようとすると、それが存在しないことを意味しません(あなたの試みが失敗するか、ファイルを作成するのではなくファイルを開くかもしれません)。

-fileExistsAtPath:があなたに語ったことにかかわらず、すべてのケースを慎重に処理する必要があるため、通常は呼び出さないことが最善です。それは無駄なコードです。

しかし、使用するのが適切な場合があります。たとえば、UIにアプリが所有するファイルを削除するコントロールがある場合、ファイルが存在しない場合はそのコントロールを無効にすることができます。しかし、あなたはあなたのアプリのイベント/更新ループを通して各パスを再確認したいでしょう。また、ファイルが最近存在したために有効になっている場合は、アプリが実際に削除しようとしたときにアプリケーションが失敗したり、何か悪いことがあったりしてはなりません。

+0

この回答に感動しました。ありがとうございます –

関連する問題