我正在使用fs.Length
,其中fs
是FileStream
。
这是O(1)
操作吗?我认为这只会从文件的属性中读取,而不是通过文件来查找搜索位置到达结尾的时间。我试图找到长度的文件可以很容易地从1 MB到4-5 GB。
但是我注意到有一个FileInfo
类,它也有一个Length
属性。
理论上这两个Length
属性是否需要相同的时间?或者fs.Length
是否会变慢,因为它必须先打开FileStream
?
答案 0 :(得分:34)
获取.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
答案 1 :(得分:27)
两者都将访问文件系统元数据而不是读取整个文件。我不知道哪个更有效率,根据经验,我会说,如果你只想知道长度(和其他元数据),请使用FileInfo
- 而如果您要将文件作为流打开,请使用FileStream.Length
。