我正在使用 fs.Length
,其中 fs
是一个 FileStream
。
这是一个 O(1)
操作吗?我认为这只是读取文件的属性,而不是通过文件查找到达末尾的位置。我需要查找长度的文件大小范围可能从 1 MB 到 4-5 GB。
然而,我注意到还有一个 FileInfo
类,它也有一个 Length
属性。
这两个 Length
属性理论上需要相同的时间吗?或者因为必须先打开 FileStream
,所以 fs.Length
更慢?
我正在使用 fs.Length
,其中 fs
是一个 FileStream
。
这是一个 O(1)
操作吗?我认为这只是读取文件的属性,而不是通过文件查找到达末尾的位置。我需要查找长度的文件大小范围可能从 1 MB 到 4-5 GB。
然而,我注意到还有一个 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
。