2012-02-07 17 views
21

fs.Lengthを使用しています。fsFileStreamです。ファイルの長さを読み取る最速の方法C#

これはO(1)操作ですか?シークの位置が終わりに達したときにファイルを調べるのではなく、ファイルのプロパティから読み込むと思うでしょう。私が見つけようとしているファイルは、1 MBから4〜5 GBの範囲で簡単です。

しかし、FileInfoクラスがあり、それにはLengthというプロパティがあります。

これらの両方のプロパティは、理論的には同じ時間がかかりますか?または、最初にFileStreamを開く必要があるため、fs.Lengthが遅くなりますか?

答えて

30

.NETでファイルサイズを取得する自然な方法は、あなたが言及したFileInfo.Lengthプロパティです。

私は(それはとにかくファイル全体を読むことはありません)Stream.Lengthが遅くなるかわからないが、それはあなたがファイルを読むために計画していない場合は代わりにFileStreamFileInfoを使用するように間違いなく、より自然なことです。

private static void Main(string[] args) 
{ 
    string filePath = ...; // Path to 2.5 GB file here 

    Stopwatch z1 = new Stopwatch(); 
    Stopwatch z2 = new Stopwatch(); 

    int count = 10000; 

    z1.Start(); 
    for (int i = 0; i < count; i++) 
    { 
     long length; 
     using (Stream stream = new FileStream(filePath, FileMode.Open)) 
     { 
      length = stream.Length; 
     } 
    } 

    z1.Stop(); 

    z2.Start(); 
    for (int i = 0; i < count; i++) 
    { 
     long length = new FileInfo(filePath).Length; 
    } 

    z2.Stop(); 

    Console.WriteLine(string.Format("Stream: {0}", z1.ElapsedMilliseconds)); 
    Console.WriteLine(string.Format("FileInfo: {0}", z2.ElapsedMilliseconds)); 

    Console.ReadKey(); 
} 

結果

Stream: 886 
FileInfo: 727 
+0

タイミングの情報をありがとう! – jpints14

+1

そのようなベンチマーキングは、差異がある場合にはそれをテストする最も効果的な方法ではないかもしれません。私はディスクキャッシュ/ OSの要因が時間を維持するためにかなりの役割を果たすと思う。 – PaulG

+0

@PaulGあなたはそうです。ベンチマーキングは常に見た目より**複雑です**。 **上記**の単純なベンチマークは、実際の結果に関するいくつかの兆候を示しています。 100000対250と返されないので、どちらのメソッドも(計算時間に関して)あまりにも多すぎるとは限りません。 – ken2k

23

両方ともファイル全体を読み取るのではなく、ファイルシステムのメタデータにアクセスします。私はあなたがだけの長さ(および他のメタデータ)を知りたい場合は、FileInfoを使用していますが、あなたがファイルをとにかくストリーム、FileStream.Lengthを使用してください。

+0

はあなたに氏スキートありがとう


は、ここではいくつかの数値を提供します小さなベンチマークです! – jpints14

関連する問題