_fs.Length
_を使用しています。ここで、fs
はFileStream
です。
これはO(1)
操作ですか?これは、ファイルを調べてシーク位置が最後に到達したときを見つけるのではなく、ファイルのプロパティから読み取るだけだと思います。私が見つけようとしているファイルの長さは、1 MBから4〜5GBの範囲です。
しかし、FileInfo
プロパティもあるLength
クラスがあることに気づきました。
これらのLength
プロパティは両方とも理論的に同じ時間がかかりますか?または、最初にFileStream
を開く必要があるため、_fs.Length
_は遅くなりますか?
。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
どちらも、ファイル全体を読み取るのではなく、ファイルシステムのメタデータにアクセスします。どちらが必ずしも効率的かはわかりません。経験則として、あなたのみが長さ(およびその他)を知りたい場合は、メタデータ)、FileInfo
を使用します。一方、ファイルをストリームとして開く場合は、FileStream.Length
を使用します。