web-dev-qa-db-ja.com

ファイル長C#を読み取る最速の方法

_fs.Length_を使用しています。ここで、fsFileStreamです。

これはO(1)操作ですか?これは、ファイルを調べてシーク位置が最後に到達したときを見つけるのではなく、ファイルのプロパティから読み取るだけだと思います。私が見つけようとしているファイルの長さは、1 MBから4〜5GBの範囲です。

しかし、FileInfoプロパティもあるLengthクラスがあることに気づきました。

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

24
jpints14

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

私はわかりません Stream.Lengthは低速です(とにかくファイル全体を読み取ることはありません)が、ファイルを読み取る予定がない場合は、FileInfoの代わりにFileStreamを使用する方が確実に自然です。


いくつかの数値を提供する小さなベンチマークを次に示します。

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
35
ken2k

どちらも、ファイル全体を読み取るのではなく、ファイルシステムのメタデータにアクセスします。どちらが必ずしも効率的かはわかりません。経験則として、あなたのみが長さ(およびその他)を知りたい場合は、メタデータ)、FileInfoを使用します。一方、ファイルをストリームとして開く場合は、FileStream.Lengthを使用します。

28
Jon Skeet