tipos - La forma más rápida de leer la longitud del archivo C#
manejo de archivos en c pdf (2)
Ambos accederán a los metadatos del sistema de archivos en lugar de leer todo el archivo. No sé cuál es necesariamente más eficiente, como regla general diría que si solo quieres saber la longitud (y otros metadatos), usa FileInfo
, mientras que si de todos modos estás abriendo el archivo , use FileStream.Length
.
Estoy usando fs.Length
, donde fs
es un FileStream
.
¿Es esta una operación O(1)
? Pensaría que esto solo se leería de las propiedades del archivo, en lugar de ir a través del archivo para encontrar cuando la posición de búsqueda ha llegado al final. El archivo en el que estoy tratando de encontrar la longitud puede variar fácilmente de 1 MB a 4-5 GB.
Sin embargo, me di cuenta de que hay una clase FileInfo
, que también tiene una propiedad Length
.
¿Toman teóricamente estas dos propiedades de Length
la misma cantidad de tiempo? ¿O es fs.Length
más lento porque primero debe abrir FileStream
?
La forma natural de obtener el tamaño del archivo en .NET es la propiedad FileInfo.Length que mencionó.
No estoy seguro de que Stream.Length
sea más lento (de todos modos no leerá todo el archivo), pero definitivamente es más natural usar FileInfo
lugar de FileStream
si no planea leer el archivo.
Aquí hay un pequeño punto de referencia que proporcionará algunos valores numéricos:
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();
}
Resultados :
Stream: 886
FileInfo: 727