web-dev-qa-db-ja.com

静的メソッドを使用して.NETでファイルのサイズを取得する方法はありますか?

ファイルのサイズを取得する通常の方法は、FileInfoインスタンスを使用することです。

using System.IO;
class SizeGetter
{
  public static long GetFileSize(string filename)
  {
    FileInfo fi = new FileInfo(filename);
    return fi.Length;
  }
}

静的メソッドを使用して、FileInfoのインスタンスを作成せずに同じことを行う方法はありますか?

ファイルサイズが必要になるたびに、新しいインスタンスを作成するのがおかしくなりそうですが、たとえば、5000以上のファイルを含むディレクトリの合計サイズを計算しようとしています。 GCの最適化と同じように、不必要に課税することなくこれを行う方法はありませんか?

39
Will

心配しないでください。まず、.NETでの割り当ては安価です。次に、そのオブジェクトはgen 0にあるため、オーバーヘッドをあまりかけずに収集する必要があります。

17
Dmitry

心配しないでください。

  • .NETでのオブジェクト作成のオーバーヘッドを測定した誰かのブログ投稿を見つけました( C#オブジェクト作成時間トライアル )、そして、結局のところ、10,000オブジェクトの作成には0.03秒かかりました。オブジェクトあたり3 µs。ファイルシステムからファイル長を読み取るのに必要な時間は、これらの3マイクロ秒を大幅に支配します。

  • .NETフレームワークの多くの静的メソッドは、内部でオブジェクトを作成し、それらのインスタンスメソッドを呼び出します(参照ソースを確認するか、反射ツールを使用してこれを確認できます)。静的メソッドの方が速いassume。そのような仮定をしないでください。同じことを行う方法が2つある場合は、measureどちらが速いかを示します。

16
Heinzi

本当に静的メソッドが本当に必要な場合は、ネイティブの GetFileSize または GetFileSizeEx APIを使用してください。ただし、これにはCreateFile AP​​Iからのファイルへのハンドルが必要になることに注意してください。

FileInfoクラスのソースを表示することもできます:

http://referencesource.Microsoft.com/#mscorlib/system/io/fileinfo.cs#4ee673c1a4ecad41

4
user3666697