Definitivamente lo que pides NO es posible: NO se puede obtener información de TODO el archivo SIN leerlo por completo.
Lo que si puedes hacer es evitarte leerlo línea por línea, lo que hará que el proceso de saber cuantas líneas tiene sea mucho más veloz.
Te paso un código que espero te ayude.
Lo que hace es utilizar el acceso binario para leer el archivo de a bloques de 64 Kb.
El código de la función ContarLíneas no ha sido testeado, por lo que tal vez merece algun que otro "retoque".
Espero que te sirva.
Salu2
'Declara Constantes Globales
Const BlockSizeConst As Single = 65535
Private Function ContarLineas (M As Variant) As Long
'recibe una matriz de 64 Kb y retorna la cantidad de caracteres chr(10) que encontró '(la cantidad de líneas).
Dim NumLineas as Long
Dim Cadena as String
Dim Pos as Long
Cadena = CStr(M)
NumLineas = 0
Pos = InStr(1,Cadena,chr(10))
While Pos <> 0
NumLineas = NumLineas + 1
Pos = InsStr(1,Cadena,chr(10))
Wend
ContarLineas = NumLineas
End Function
Private Function ContarLineasDeArchivo(NombreArchivo as String) as Long
'utiliza el acceso binario para leer el archivo de a bloques de 64 Kb, contando
'las líneas que hay en cada bloque
'Declara Variables
Dim Arch As Integer
Dim LofArch As Long
Dim CantLineas As Long; 'número de líneas totales
Dim ByteMatriz() As Byte
Dim BlockSize As Single
'Inicializa Archivo
Arch = FreeFile()
Open NombreArchivo For Binary As Arch
LofArch = LOF(Arch)
'Establece Tamaño de Bloque adaptándolo al archivo
If LofArch < BlockSizeConst Then
BlockSize = LofArch
Else
BlockSize = BlockSizeConst
End If
ReDim ByteMatriz(BlockSize)
'Lee Bloque/s desde Disco contando líneas
PosArch = 1
CantLineas = 0
While PosArch + BlockSize <= LofArch 'significa que se puede seguir leyendo
Get Arch, PosArch, ByteMatriz
PosArch = PosArch + BlockSize
CantLineas = CantLineas + ContarLineas(ByteMatriz)
DoEvents
Wend
'Procesa la cola del archivo
If LofArch > PosArch then
ReDim ByteMatriz(LofArch - PosArch)
Get Arch, PosArch, ByteMatriz
Call ContarLineas(ByteMatriz, NumLineas)
CantLineas = CantLineas + ContarLineas(ByteMatriz)
End if
'Cierra Archivo
Close (Arch)
ContarLineasdeArchivo = CantLineas
End Function
>Tengo un archivo plano de N lineas, cada linea tiene un tamaño
>diferente! para leer el arcihvo utilizo line input y funciona bien! pero
>lo que necesito es saber cuantas lineas tiene el archivo sin tener que
>recorrerlo hasta el final! y lo otro es posible obtener informacion de
>la ultima linea?
Ok, vamos por partes. Lo tuyo entra dentro de lo que yo llamaria
optimizacion de un programa.
Para contar la cantidad de lineas deberias contar la cantidad de CR+LF que tenes en el archivo, y esto no es posible hacerlo sin leerlo.
Los archivos de texto de entrada tienen tamaños razonables, lo que yo hago en estos casos es cargalos a un string y a partir de alli hago todo el procesamiento. Lo que logro con esto es velocidad ya que accedo a leer el archivo 1 sola vez. Si te resulta atractivo hacerlo asi luego usando la funcion "IsStr" podrias contar la cantidad de CR+LF que tenes en el archivo y buscar la ultima linea no es muy complicado tampoco.
En particular yo he cargado archvos de texto a memoria de 4Mb.
Aca tenes una funcion para cargar una archivo a memoria
Sub ReadFileToMem(PathName)
'Lee el archivo de texto completo y lo coloca
'en la variable Global FileImage
'Creo que es mas rapido cargar el archivo en memoria
'que accederlo de disco.
Dim h As Integer
h = FreeFile
FileSize = FileLen(PathName)
Open PathName For Binary Access Read As #h
FileImage = Input(FileSize, #h)
Close #h
End Sub
>Tengo un archivo plano de N lineas, cada linea tiene un tamaño
>diferente! para leer el arcihvo utilizo line input y funciona bien! pero
>lo que necesito es saber cuantas lineas tiene el archivo sin tener que
>recorrerlo hasta el final! y lo otro es posible obtener informacion de
>la ultima linea?