2009-03-20 29 views
14

私の新しいコードでは、ではありませんディレクトリパスまたはファイル名を渡す文字列を使用しています。代わりに、彼らは多くの情報をカプセル化するように見えるので、私はDirectoryInfoとFileInfoを使用しています。DirectoryInfo/FileInfoを使用する代わりに文字列としてパスを渡すよい理由

文字列を使用してディレクトリ情報を渡すコードが多数あり、探しているディレクトリの一部を取得するまで、わかりにくいステートメントで「分割」と「中間」と「instr」があります。

パスを文字列として渡す理由はありますか?

答えて

10

一般に、私はFileInfo/DirectoryInfoの情報を保存する方が良いと思います。これらのクラスには多くの便利な機能がありますが、ファイルの存在を確認するのがはるかに簡単であること、最初に指定されたファイルなどを確認することなど多くの安全性があります。

私は唯一の場所です(潜在的に)FileInfoを使用する代わりに文字列としてパスを渡し、パスがAppDomains間やプロセス間などに渡される場合はDirectoryInfoとなります。

FileInfoとDirectoryInfoは、シリアル化可能)が、この状況ではかなりのオーバーヘッドがあります。物事が前後すると、それが影響を与える可能性があります。

プロファイリング中に目立った問題があって、シリアル化されたデータの量を減らそうとしていない限り、この場合はFileInfoとDirectoryInfoを使用します。パフォーマンスに関する問題に遭遇していない場合は、これらのクラスを使用することで、多くの安全性と機能性を提供することができます。

+0

ファイルの存在または変更されたタイムスタンプが変更された場合は、新しいFileInfo/DirectoryInfoを作成する必要があります。 – sighol

4

パスがアプリケーション内にある場合(つまり、プレーンテキストの設定ファイルではない場合)、いいえ、理由はありません。

唯一の時間は、文字列としてパスを受け入れるコードと相互運用するときに役立つことがあります。

5

DirectoryInfoとFileInfoは、必要なものがパスである場合に、周回するためにひどく重いです。私は「スプリット・アンド・ミッド・アンド・インスティテュート」ジャンクを心配しています。ところで、これらはSystem.IO.Pathクラスからです

Path.GetFileName
Path.GetDirectoryName
Path.Combine
等...

:の方法を学びます。

+0

インスタンスを関数に渡しているときは、オブジェクト全体のコピーではなく、参照のコピーを渡していることに注意してください。だからあなたが本当に渡しているのは、ポインタのコピーです... –

+0

私はこの問題がいくつかのバイトが渡されるのではなく、むしろFileInfo/DirectoryInfoを使用することのオーバーヘッドが、ファイルをさまざまな方法で調べて情報をキャッシュしなければならないと考えています。 –

+1

しかし、最初は読みやすくするために最適化します。 –

0

FileInfoをDMZに渡すときに問題が発生しました。限り、私が見ることができます - 私が間違っている場合私を修正する - FileInfoは、deserializingとDMZから動作しないと 'パスが見つかりません'の結果が動作しません許可チェックを実行します。代わりに、カスタムオブジェクトを作成して渡します。

0

生の文字列を使用せずに静的System.IO.Pathクラスを使用してファイルやディレクトリパスをカプセル化するクラスが必要だと思います。しかし、I don't find DirectoryInfo and FileInfo suitableは、パス操作の代わりにファイル/ディレクトリ操作を行うためのものです。パス操作用のカスタムクラスを作成する場合は、more user friendly path manipulation functionalityを指定できます。

関連する問題