我使用的是fs.Length,其中fs是一个FileStream。
这是一个O(1)操作吗?我认为这将只是从文件的属性中读取,而不是通过文件来查找何时查找位置已到达末尾。我尝试查找的文件长度可以轻松地从1MB到4-5 GB。
但是我注意到有一个FileInfo类,它也有一个Length属性。
从理论上讲,这两个Length属性是否需要相同的时间?或者是因为必须先打开FileStream,所以fs.Length变慢了?
发布于 2012-02-07 23:17:37
在.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发布于 2012-02-07 23:15:18
两者都将访问文件系统元数据,而不是读取整个文件。我不知道哪个更有效,作为一个经验法则,我会说,如果你只想知道长度(和其他元数据),使用FileInfo -而如果你无论如何都是以流的形式打开文件,使用FileStream.Length。
https://stackoverflow.com/questions/9178681
复制相似问题